/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e46c09e1fb10d9b9822441cbc0e92712d68b193c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 20 64 65  bugPrintf X.# de
0460: 66 69 6e 65 20 57 48 45 52 45 54 52 41 43 45 5f  fine WHERETRACE_
0470: 45 4e 41 42 4c 45 44 20 31 0a 23 65 6c 73 65 0a  ENABLED 1.#else.
0480: 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52  # define WHERETR
0490: 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ACE(X).#endif../
04a0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
04b0: 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce.*/.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73  truct WhereClaus
04d0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74  e WhereClause;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65  ereMaskSet Where
0500: 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66  MaskSet;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49   struct WhereOrI
0520: 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b  nfo WhereOrInfo;
0530: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0540: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65  WhereAndInfo Whe
0550: 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64  reAndInfo;.typed
0560: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  ef struct WhereL
0570: 6f 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74  oop WhereLoop;.t
0580: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
0590: 65 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74  erePath WherePat
05a0: 68 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  h;.typedef struc
05b0: 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72  t WhereTerm Wher
05c0: 65 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73  eTerm;.typedef s
05d0: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42  truct WhereLoopB
05e0: 75 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70  uilder WhereLoop
05f0: 42 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66  Builder;.typedef
0600: 20 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61   struct WhereSca
0610: 6e 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70  n WhereScan;.typ
0620: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0630: 65 56 74 61 62 50 6c 61 6e 20 57 68 65 72 65 56  eVtabPlan WhereV
0640: 74 61 62 50 6c 61 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a  tabPlan;.../*.**
0650: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
0660: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65  f this object re
0670: 70 72 65 73 65 6e 74 73 20 61 20 77 61 79 20 6f  presents a way o
0680: 66 20 65 76 61 6c 75 61 74 69 6e 67 20 6f 6e 65  f evaluating one
0690: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f  .** term of a jo
06a0: 69 6e 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  in.  The WhereCl
06b0: 61 75 73 65 20 6f 62 6a 65 63 74 20 68 6f 6c 64  ause object hold
06c0: 73 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  s a table of the
06d0: 73 65 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 75 73  se.** objects us
06e0: 69 6e 67 20 28 6d 61 73 6b 53 65 6c 66 2c 70 72  ing (maskSelf,pr
06f0: 65 72 65 71 2c 29 20 61 73 20 74 68 65 20 70 72  ereq,) as the pr
0700: 69 6d 61 72 79 20 6b 65 79 2e 20 20 4e 6f 74 65  imary key.  Note
0710: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d   that the.** sam
0720: 65 20 6a 6f 69 6e 20 74 65 72 6d 20 6d 69 67 68  e join term migh
0730: 74 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  t have multiple 
0740: 61 73 73 6f 63 69 61 74 65 64 20 57 68 65 72 65  associated Where
0750: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Loop objects..*/
0760: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f  .struct WhereLoo
0770: 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72  p {.  Bitmask pr
0780: 65 72 65 71 3b 20 20 20 20 20 20 20 2f 2a 20 42  ereq;       /* B
0790: 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68 65 72 20  itmask of other 
07a0: 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75 73 74 20  loops that must 
07b0: 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 42  run first */.  B
07c0: 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65 6c 66 3b  itmask maskSelf;
07d0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
07e0: 69 64 65 6e 74 69 66 79 69 6e 67 20 74 61 62 6c  identifying tabl
07f0: 65 20 69 54 61 62 20 2a 2f 0a 23 69 66 64 65 66  e iTab */.#ifdef
0800: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0810: 63 68 61 72 20 63 49 64 3b 20 20 20 20 20 20 20  char cId;       
0820: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 69        /* Symboli
0830: 63 20 49 44 20 6f 66 20 74 68 69 73 20 6c 6f 6f  c ID of this loo
0840: 70 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  p for debugging 
0850: 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  use */.#endif.  
0860: 75 38 20 69 54 61 62 3b 20 20 20 20 20 20 20 20  u8 iTab;        
0870: 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
0880: 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  n in FROM clause
0890: 20 6f 66 20 74 61 62 6c 65 20 66 6f 72 20 74 68   of table for th
08a0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20  is loop */.  u8 
08b0: 69 53 6f 72 74 49 64 78 3b 20 20 20 20 20 20 20  iSortIdx;       
08c0: 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 69 6e     /* Sorting in
08d0: 64 65 78 20 6e 75 6d 62 65 72 2e 20 20 30 3d 3d  dex number.  0==
08e0: 4e 6f 6e 65 20 2a 2f 0a 20 20 75 31 36 20 6e 54  None */.  u16 nT
08f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
0900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
0910: 72 69 65 73 20 69 6e 20 61 54 65 72 6d 5b 5d 20  ries in aTerm[] 
0920: 2a 2f 0a 20 20 75 33 32 20 77 73 46 6c 61 67 73  */.  u32 wsFlags
0930: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48  ;          /* WH
0940: 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 73 63  ERE_* flags desc
0950: 72 69 62 69 6e 67 20 74 68 65 20 70 6c 61 6e 20  ribing the plan 
0960: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 53 65 74  */.  double rSet
0970: 75 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  up;        /* On
0980: 65 2d 74 69 6d 65 20 73 65 74 75 70 20 63 6f 73  e-time setup cos
0990: 74 20 28 65 78 3a 20 63 72 65 61 74 65 20 74 72  t (ex: create tr
09a0: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 29 20 2a  ansient index) *
09b0: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 52 75 6e 3b  /.  double rRun;
09c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
09d0: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 65 61 63  t of running eac
09e0: 68 20 6c 6f 6f 70 20 2a 2f 0a 20 20 64 6f 75 62  h loop */.  doub
09f0: 6c 65 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  le nOut;        
0a00: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
0a10: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
0a20: 72 6f 77 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  rows */.  union 
0a30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 20 20  {.    struct {  
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a50: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
0a60: 69 6e 74 65 72 6e 61 6c 20 62 74 72 65 65 20 74  internal btree t
0a70: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
0a80: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
0a90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0aa0: 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  of equality cons
0ab0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
0ac0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
0ad0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
0ae0: 20 75 73 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a   used, or NULL *
0af0: 2f 0a 20 20 20 20 7d 20 62 74 72 65 65 3b 0a 20  /.    } btree;. 
0b00: 20 20 20 73 74 72 75 63 74 20 7b 20 20 20 20 20     struct {     
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
0b20: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 76 69 72  ormation for vir
0b30: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
0b40: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b       int idxNum;
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
0b60: 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
0b70: 20 20 20 20 20 75 38 20 6e 65 65 64 46 72 65 65       u8 needFree
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0b90: 72 75 65 20 69 66 20 73 71 6c 69 74 65 33 5f 66  rue if sqlite3_f
0ba0: 72 65 65 28 69 64 78 53 74 72 29 20 69 73 20 6e  ree(idxStr) is n
0bb0: 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 75  eeded */.      u
0bc0: 38 20 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20  8 isOrdered;    
0bd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0be0: 20 73 61 74 69 73 66 69 65 73 20 4f 52 44 45 52   satisfies ORDER
0bf0: 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 75 31 36   BY */.      u16
0c00: 20 6f 6d 69 74 4d 61 73 6b 3b 20 20 20 20 20 20   omitMask;      
0c10: 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 74 68 61      /* Terms tha
0c20: 74 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64  t may be omitted
0c30: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
0c40: 69 64 78 53 74 72 3b 20 20 20 20 20 20 20 20 20  idxStr;         
0c50: 20 2f 2a 20 49 6e 64 65 78 20 69 64 65 6e 74 69   /* Index identi
0c60: 66 69 65 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20  fier string */. 
0c70: 20 20 20 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75     } vtab;.  } u
0c80: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  ;.  WhereTerm **
0c90: 61 54 65 72 6d 3b 20 20 20 20 2f 2a 20 57 68 65  aTerm;    /* Whe
0ca0: 72 65 54 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a  reTerms used */.
0cb0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
0cc0: 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e 65 78 74 20  xtLoop; /* Next 
0cd0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
0ce0: 20 69 6e 20 74 68 65 20 57 68 65 72 65 43 6c 61   in the WhereCla
0cf0: 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  use */.};../*.**
0d00: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
0d10: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f  f this object ho
0d20: 6c 64 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f  lds a sequence o
0d30: 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
0d40: 63 74 73 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c  cts.** that impl
0d50: 65 6d 65 6e 74 20 73 6f 6d 65 20 6f 72 20 61 6c  ement some or al
0d60: 6c 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  l of the entire 
0d70: 71 75 65 72 79 20 70 6c 61 6e 2e 20 20 0a 2a 2f  query plan.  .*/
0d80: 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61 74  .struct WherePat
0d90: 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  h {.  Bitmask ma
0da0: 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20 42  skLoop;     /* B
0db0: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57 68  itmask of all Wh
0dc0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
0dd0: 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  in this path */.
0de0: 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f 6f    Bitmask revLoo
0df0: 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f 70  p;      /* aLoop
0e00: 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  []s that should 
0e10: 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72 20  be reversed for 
0e20: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 64 6f  ORDER BY */.  do
0e30: 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20  uble nRow;      
0e40: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
0e50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0e60: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69  generated by thi
0e70: 73 20 70 61 74 68 20 2a 2f 0a 20 20 64 6f 75 62  s path */.  doub
0e80: 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  le rCost;       
0e90: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74 20    /* Total cost 
0ea0: 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  of this path */.
0eb0: 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b 20    u8 isOrdered; 
0ec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0ed0: 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61 74  if this path sat
0ee0: 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59 20  isfies ORDER BY 
0ef0: 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65  */.  u8 isOrdere
0f00: 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54 72  dValid;    /* Tr
0f10: 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64 65  ue if the isOrde
0f20: 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61 6c  red field is val
0f30: 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  id */.  WhereLoo
0f40: 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f 2a  p **aLoop;    /*
0f50: 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65 4c   Array of WhereL
0f60: 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70 6c  oop objects impl
0f70: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70 61  ementing this pa
0f80: 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  th */.};../*.** 
0f90: 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72 61  The query genera
0fa0: 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72 61  tor uses an arra
0fb0: 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  y of instances o
0fc0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0fd0: 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61   to.** help it a
0fe0: 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65 78  nalyze the subex
0ff0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1010: 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c  Each WHERE.** cl
1020: 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73 69  ause subexpressi
1030: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
1040: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
1050: 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 73  by AND operators
1060: 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f 72  ,.** usually, or
1070: 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65 78   sometimes subex
1080: 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72 61  pressions separa
1090: 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a  ted by OR..**.**
10a0: 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73 20   All WhereTerms 
10b0: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  are collected in
10c0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
10d0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
10e0: 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  e.  .** The foll
10f0: 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20 68  owing identity h
1100: 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  olds:.**.**     
1110: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57 43     WhereTerm.pWC
1120: 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69 64  ->a[WhereTerm.id
1130: 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a  x] == WhereTerm.
1140: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65 72  **.** When a ter
1150: 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  m is of the form
1160: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1170: 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70       X <op> <exp
1180: 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58  r>.**.** where X
1190: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d   is a column nam
11a0: 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  e and <op> is on
11b0: 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70 65  e of certain ope
11c0: 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20  rators,.** then 
11d0: 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 75  WhereTerm.leftCu
11e0: 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54 65  rsor and WhereTe
11f0: 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  rm.u.leftColumn 
1200: 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75  record the.** cu
1210: 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20  rsor number and 
1220: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f  column number fo
1230: 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e  r X.  WhereTerm.
1240: 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64  eOperator record
1250: 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73  s.** the <op> us
1260: 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e  ing a bitmask en
1270: 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62  coding defined b
1280: 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20  y WO_xxx below. 
1290: 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61   The.** use of a
12a0: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
12b0: 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  g for the operat
12c0: 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  or allows us to 
12d0: 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c  search.** quickl
12e0: 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  y for terms that
12f0: 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65   match any of se
1300: 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
1310: 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  operators..**.**
1320: 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69 67   A WhereTerm mig
1330: 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20 6f  ht also be two o
1340: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
1350: 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 3a  connected by OR:
1360: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 28  .**.**         (
1370: 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  t1.X <op> <expr>
1380: 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e 20  ) OR (t1.Y <op> 
1390: 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e 0a  <expr>) OR .....
13a0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73 65  **.** In this se
13b0: 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c 61  cond case, wtFla
13c0: 67 20 61 73 20 74 68 65 20 54 45 52 4d 5f 4f 52  g as the TERM_OR
13d0: 49 4e 46 4f 20 73 65 74 20 61 6e 64 20 65 4f 70  INFO set and eOp
13e0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a  erator==WO_OR.**
13f0: 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 54 65   and the WhereTe
1400: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66 69 65  rm.u.pOrInfo fie
1410: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 75 78  ld points to aux
1420: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
1430: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f  on that.** is co
1440: 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20 74 68  llected about th
1450: 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65 72  e.**.** If a ter
1460: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
1470: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
1480: 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20 74  atch either of t
1490: 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73 0a  he two previous.
14a0: 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20 74  ** categories, t
14b0: 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d 30  hen eOperator==0
14c0: 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72 6d  .  The WhereTerm
14d0: 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73 20  .pExpr field is 
14e0: 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f 20  still set.** to 
14f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 62  the original sub
1500: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 65  expression conte
1510: 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20 69  nt and wtFlags i
1520: 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70 72  s set up appropr
1530: 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e 6f  iately.** but no
1540: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69 6e   other fields in
1550: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20 6f   the WhereTerm o
1560: 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69 6e  bject are meanin
1570: 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  gful..**.** When
1580: 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20 70   eOperator!=0, p
1590: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
15a0: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
15b0: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
15c0: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
15d0: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
15e0: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
15f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
1600: 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65  ucture translate
1610: 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62  s.** cursor numb
1620: 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64  er into bits and
1630: 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20   the translated 
1640: 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  bit is stored in
1650: 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66   the prereq.** f
1660: 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e  ields.  The tran
1670: 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  slation is used 
1680: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69  in order to maxi
1690: 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mize the number 
16a0: 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20  of.** bits that 
16b0: 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69  will fit in a Bi
16c0: 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45  tmask.  The VDBE
16d0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
16e0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65  might be.** spre
16f0: 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20  ad out over the 
1700: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
1710: 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d  egers.  For exam
1720: 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a  ple, the cursor.
1730: 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  ** numbers might
1740: 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c   be 3, 8, 9, 10,
1750: 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64   20, 23, 41, and
1760: 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65 4d   45.  The WhereM
1770: 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c  askSet.** transl
1780: 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72 73  ates these spars
1790: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
17a0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
17b0: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65  e integers.** be
17c0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69  ginning with 0 i
17d0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
17e0: 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c  the best possibl
17f0: 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76 61  e use of the ava
1800: 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69  ilable.** bits i
1810: 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20  n the Bitmask.  
1820: 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70  So, in the examp
1830: 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75  le above, the cu
1840: 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20  rsor numbers.** 
1850: 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  would be mapped 
1860: 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20  into integers 0 
1870: 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a 2a  through 7..**.**
1880: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
1890: 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20 69  erms in a join i
18a0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
18b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 0a   number of bits.
18c0: 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67 68  ** in prereqRigh
18d0: 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 2e  t and prereqAll.
18e0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
18f0: 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65 20   64 bits, hence 
1900: 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e 6c  SQLite.** is onl
1910: 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73  y able to proces
1920: 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34 20  s joins with 64 
1930: 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73 2e  or fewer tables.
1940: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1950: 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a 70  Term {.  Expr *p
1960: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1970: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1980: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
1990: 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74 65   that is this te
19a0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  rm */.  int iPar
19b0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
19c0: 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e  /* Disable pWC->
19d0: 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20  a[iParent] when 
19e0: 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c  this term disabl
19f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66 74  ed */.  int left
1a00: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
1a10: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
1a20: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
1a30: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 6e   <expr>" */.  un
1a40: 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65  ion {.    int le
1a50: 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20  ftColumn;       
1a60: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
1a70: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
1a80: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
1a90: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
1aa0: 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78 74  OrInfo;   /* Ext
1ab0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1ac0: 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20 57  f (eOperator & W
1ad0: 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20 20  O_OR)!=0 */.    
1ae0: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41  WhereAndInfo *pA
1af0: 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72 61  ndInfo; /* Extra
1b00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20   information if 
1b10: 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f 41  (eOperator& WO_A
1b20: 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b  ND)!=0 */.  } u;
1b30: 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72  .  u16 eOperator
1b40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1b50: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
1b60: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
1b70: 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20   u8 wtFlags;    
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d           /* TERM
1b90: 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20  _xxx bit flags. 
1ba0: 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20   See below */.  
1bb0: 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20  u8 nChild;      
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bd0: 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68  r of children th
1be0: 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20  at must disable 
1bf0: 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  us */.  WhereCla
1c00: 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
1c10: 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68  /* The clause th
1c20: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1c30: 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  of */.  Bitmask 
1c40: 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20  prereqRight;    
1c50: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
1c60: 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45 78  bles used by pEx
1c70: 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20  pr->pRight */.  
1c80: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
1c90: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
1ca0: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
1cb0: 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70 72  erenced by pExpr
1cc0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c   */.};../*.** Al
1cd0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
1ce0: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
1cf0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  s.*/.#define TER
1d00: 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30  M_DYNAMIC    0x0
1d10: 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63  1   /* Need to c
1d20: 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44  all sqlite3ExprD
1d30: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1d40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
1d50: 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30 32  _VIRTUAL    0x02
1d60: 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74     /* Added by t
1d70: 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44  he optimizer.  D
1d80: 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64  o not code */.#d
1d90: 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44  efine TERM_CODED
1da0: 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20        0x04   /* 
1db0: 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72  This term is alr
1dc0: 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64  eady coded */.#d
1dd0: 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45  efine TERM_COPIE
1de0: 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20  D     0x08   /* 
1df0: 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23  Has a child */.#
1e00: 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e  define TERM_ORIN
1e10: 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a  FO     0x10   /*
1e20: 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68   Need to free th
1e30: 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f  e WhereTerm.u.pO
1e40: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  rInfo object */.
1e50: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44  #define TERM_AND
1e60: 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f  INFO    0x20   /
1e70: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1e80: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1e90: 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23  AndInfo obj */.#
1ea0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f  define TERM_OR_O
1eb0: 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a  K      0x40   /*
1ec0: 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d   Used during OR-
1ed0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
1ee0: 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
1ef0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
1f00: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1f10: 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f  NULL    0x80   /
1f20: 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78  * Manufactured x
1f30: 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c  >NULL or x<=NULL
1f40: 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23   term */.#else.#
1f50: 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e    define TERM_VN
1f60: 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a  ULL    0x00   /*
1f70: 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74   Disabled if not
1f80: 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f 0a   using stat3 */.
1f90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e  #endif../*.** An
1fa0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1fb0: 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63   WhereScan objec
1fc0: 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  t is used as an 
1fd0: 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 63  iterator for loc
1fe0: 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20 69  ating.** terms i
1ff0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2000: 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65 66  se that are usef
2010: 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79 20  ul to the query 
2020: 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75  planner..*/.stru
2030: 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a 20  ct WhereScan {. 
2040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 43 75 72   WhereTerm *pCur
2050: 72 65 6e 74 3b 20 20 20 20 20 20 20 2f 2a 20 4d  rent;       /* M
2060: 6f 73 74 20 72 65 63 65 6e 74 20 6d 61 74 63 68  ost recent match
2070: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2080: 65 20 2a 70 4f 72 69 67 57 43 3b 20 20 20 20 20  e *pOrigWC;     
2090: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c 20 69 6e   /* Original, in
20a0: 6e 65 72 6d 6f 73 74 20 57 68 65 72 65 43 6c 61  nermost WhereCla
20b0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
20c0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
20d0: 20 20 20 20 2f 2a 20 57 68 65 72 65 43 6c 61 75      /* WhereClau
20e0: 73 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  se currently bei
20f0: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  ng scanned */.  
2100: 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b  char *zCollName;
2110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2120: 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6e 67  quired collating
2130: 20 73 65 71 75 65 6e 63 65 2c 20 69 66 20 6e 6f   sequence, if no
2140: 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  t NULL */.  char
2150: 20 69 64 78 61 66 66 3b 20 20 20 20 20 20 20 20   idxaff;        
2160: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d         /* Must m
2170: 61 74 63 68 20 74 68 69 73 20 61 66 66 69 6e 69  atch this affini
2180: 74 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65  ty, if zCollName
2190: 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69  !=NULL */.  unsi
21a0: 67 6e 65 64 20 63 68 61 72 20 6e 45 71 75 69 76  gned char nEquiv
21b0: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
21c0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
21d0: 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73  Equiv[] */.  uns
21e0: 69 67 6e 65 64 20 63 68 61 72 20 69 45 71 75 69  igned char iEqui
21f0: 76 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  v;      /* Next 
2200: 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 6e 20 61  unused slot in a
2210: 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75 33 32  Equiv[] */.  u32
2220: 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
2230: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 70          /* Accep
2240: 74 61 62 6c 65 20 6f 70 65 72 61 74 6f 72 73 20  table operators 
2250: 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 2f 2a 20 52 65 73 75 6d 65 20 73 63 61 6e 6e 69  /* Resume scanni
2280: 6e 67 20 61 74 20 74 68 69 73 2d 3e 70 57 43 2d  ng at this->pWC-
2290: 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20  >a[this->k] */. 
22a0: 20 69 6e 74 20 61 45 71 75 69 76 5b 32 32 5d 3b   int aEquiv[22];
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22c0: 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20 70 61 69  ursor,Column pai
22d0: 72 73 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  rs for equivalen
22e0: 63 65 20 63 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b  ce classes */.};
22f0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2300: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2310: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68  wing structure h
2320: 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  olds all informa
2330: 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20  tion about a.** 
2340: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
2350: 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61 20  ostly this is a 
2360: 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e  container for on
2370: 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65 54  e or more WhereT
2380: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c  erms..**.** Expl
2390: 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75 74 65  anation of pOute
23a0: 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52 45 20  r:  For a WHERE 
23b0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
23c0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
23d0: 20 20 20 61 20 41 4e 44 20 28 28 62 20 41 4e 44     a AND ((b AND
23e0: 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20 65 29   c) OR (d AND e)
23f0: 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68  ) AND f.**.** Th
2400: 65 72 65 20 61 72 65 20 73 65 70 61 72 61 74 65  ere are separate
2410: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
2420: 65 63 74 73 20 66 6f 72 20 74 68 65 20 77 68 6f  ects for the who
2430: 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20 66 6f  le clause and fo
2440: 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c 61 75  r.** the subclau
2450: 73 65 73 20 22 28 62 20 41 4e 44 20 63 29 22 20  ses "(b AND c)" 
2460: 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29 22 2e  and "(d AND e)".
2470: 20 20 54 68 65 20 70 4f 75 74 65 72 20 66 69 65    The pOuter fie
2480: 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 62  ld of the.** sub
2490: 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73 20 74  clauses points t
24a0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
24b0: 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
24c0: 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e 0a 2a   whole clause..*
24d0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c  /.struct WhereCl
24e0: 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a  ause {.  Parse *
24f0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2500: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2510: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2520: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2530: 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e 67  Set;  /* Mapping
2540: 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73 6f 72   of table cursor
2550: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
2560: 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  asks */.  WhereC
2570: 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b 20 20  lause *pOuter;  
2580: 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a     /* Outer conj
2590: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
25a0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
25b0: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
25c0: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
25d0: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 75   or TK_OR */.  u
25e0: 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20  16 wctrlFlags;  
25f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74          /* Might
2600: 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41   include WHERE_A
2610: 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69 6e 74  ND_ONLY */.  int
2620: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
2630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2640: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
2650: 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
2660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2670: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2680: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
2690: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  m *a;           
26a0: 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73   /* Each a[] des
26b0: 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66  cribes a term of
26c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73   the WHERE cluas
26d0: 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  e */.#if defined
26e0: 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54  (SQLITE_SMALL_ST
26f0: 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d  ACK).  WhereTerm
2700: 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20   aStatic[1];    
2710: 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69  /* Initial stati
2720: 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20  c space for a[] 
2730: 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65  */.#else.  Where
2740: 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b  Term aStatic[8];
2750: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73      /* Initial s
2760: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
2770: 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  a[] */.#endif.};
2780: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
2790: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
27a0: 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74  or==WO_OR has it
27b0: 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e  s u.pOrInfo poin
27c0: 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20  ter set to.** a 
27d0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
27e0: 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f  cated instance o
27f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2800: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2810: 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f  ruct WhereOrInfo
2820: 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65   {.  WhereClause
2830: 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   wc;          /*
2840: 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69   Decomposition i
2850: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
2860: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
2870: 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  ble;       /* Bi
2880: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64  tmask of all ind
2890: 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e  exable tables in
28a0: 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d   the clause */.}
28b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65  ;../*.** A Where
28c0: 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61  Term with eOpera
28d0: 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20  tor==WO_AND has 
28e0: 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70  its u.pAndInfo p
28f0: 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a  ointer set to.**
2900: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
2910: 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63  llocated instanc
2920: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2930: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
2940: 0a 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64  .struct WhereAnd
2950: 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c  Info {.  WhereCl
2960: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
2970: 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72    /* The subexpr
2980: 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75  ession broken ou
2990: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
29a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
29b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
29c0: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
29d0: 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a  k of a mapping.*
29e0: 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63  * between VDBE c
29f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e  ursor numbers an
2a00: 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69  d bits of the bi
2a10: 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54  tmasks in WhereT
2a20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  erm..**.** The V
2a30: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2a40: 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74  rs are small int
2a50: 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
2a60: 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69  in .** SrcList_i
2a70: 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20  tem.iCursor and 
2a80: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
2a90: 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76  ds.  For any giv
2aa0: 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61  en WHERE .** cla
2ab0: 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  use, the cursor 
2ac0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f  numbers might no
2ad0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
2ae0: 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a  nd they might.**
2af0: 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e   contain gaps in
2b00: 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73   the numbering s
2b10: 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65  equence.  But we
2b20: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61   want to make ma
2b30: 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20  ximum.** use of 
2b40: 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20  the bits in our 
2b50: 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20  bitmasks.  This 
2b60: 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64  structure provid
2b70: 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  es a mapping.** 
2b80: 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20  from the sparse 
2b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
2ba0: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
2bb0: 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69  integers beginni
2bc0: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a  ng.** with 0..**
2bd0: 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b  .** If WhereMask
2be0: 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20  Set.ix[A]==B it 
2bf0: 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41  means that The A
2c00: 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74  -th bit of a Bit
2c10: 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  mask.** correspo
2c20: 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20  nds VDBE cursor 
2c30: 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41  number B.  The A
2c40: 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74  -th bit of a bit
2c50: 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a  mask is 1<<A..**
2c60: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
2c70: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
2c80: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
2c90: 75 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a  used these VDBE.
2ca0: 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20  ** cursors:  4, 
2cb0: 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33  5, 8, 29, 57, 73
2cc0: 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65  .  Then the  Whe
2cd0: 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
2ce0: 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70  ure.** would map
2cf0: 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75   those cursor nu
2d00: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20  mbers into bits 
2d10: 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a  0 through 5..**.
2d20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2d30: 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20   mapping is not 
2d40: 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65  necessarily orde
2d50: 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61  red.  In the exa
2d60: 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  mple.** above, t
2d70: 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74  he mapping might
2d80: 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20   go like this:  
2d90: 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32  4->3, 5->1, 8->2
2da0: 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e  , 29->0,.** 57->
2db0: 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e  5, 73->4.  Or on
2dc0: 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63  e of 719 other c
2dd0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68  ombinations migh
2de0: 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a  t be used. It.**
2df0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79   does not really
2e00: 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69   matter.  What i
2e10: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74  s important is t
2e20: 68 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f  hat sparse curso
2e30: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c  r.** numbers all
2e40: 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   get mapped into
2e50: 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61   bit numbers tha
2e60: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
2e70: 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f  nd contain.** no
2e80: 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74   gaps..*/.struct
2e90: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a   WhereMaskSet {.
2ea0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73  /* Number of ass
2ed0: 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c  igned cursor val
2ee0: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b  ues */.  int ix[
2ef0: 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20  BMS];           
2f00: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2f10: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
2f20: 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  h bit */.};../*.
2f30: 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69  ** This object i
2f40: 73 20 61 20 66 61 63 74 6f 72 79 20 66 6f 72 20  s a factory for 
2f50: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2f60: 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  s for a particul
2f70: 61 72 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72  ar query..*/.str
2f80: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
2f90: 6c 64 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e  lder {.  WhereIn
2fa0: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2fb0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2fc0: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 57 48 45  n about this WHE
2fd0: 52 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  RE */.  sqlite3 
2fe0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2ff0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
3000: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 61  nnection */.  Pa
3010: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
3020: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
3030: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3040: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3050: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  ;         /* WHE
3060: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3070: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
3080: 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  abList;        /
3090: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  * FROM clause */
30a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
30b0: 64 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20  derBy;       /* 
30c0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
30d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
30e0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  pNew;          /
30f0: 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
3100: 4c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c  Loop */.  WhereL
3110: 6f 6f 70 20 2a 70 42 65 73 74 3b 20 20 20 20 20  oop *pBest;     
3120: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55      /* If non-NU
3130: 4c 4c 2c 20 73 74 6f 72 65 20 73 69 6e 67 6c 65  LL, store single
3140: 20 62 65 73 74 20 6c 6f 6f 70 20 68 65 72 65 20   best loop here 
3150: 2a 2f 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b  */.  int mxTerm;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3170: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3180: 20 6f 66 20 61 54 65 72 6d 5b 5d 20 65 6e 74 72   of aTerm[] entr
3190: 69 65 73 20 6f 6e 20 70 4e 65 77 20 2a 2f 0a 7d  ies on pNew */.}
31a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b  ;../*.** Bitmask
31b0: 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  s for the operat
31c0: 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73  ors that indices
31d0: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70   are able to exp
31e0: 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d  loit.  An.** OR-
31f0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
3200: 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63  f these values c
3210: 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
3220: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a  searching for.**
3230: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68   terms in the wh
3240: 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23  ere clause..*/.#
3250: 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20  define WO_IN    
3260: 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57   0x001.#define W
3270: 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23  O_EQ     0x002.#
3280: 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20  define WO_LT    
3290: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d   (WO_EQ<<(TK_LT-
32a0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
32b0: 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_LE     (WO_EQ
32c0: 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29  <<(TK_LE-TK_EQ))
32d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20  .#define WO_GT  
32e0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
32f0: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
3300: 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f  e WO_GE     (WO_
3310: 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51  EQ<<(TK_GE-TK_EQ
3320: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41  )).#define WO_MA
3330: 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69  TCH  0x040.#defi
3340: 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30  ne WO_ISNULL 0x0
3350: 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52  80.#define WO_OR
3360: 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20       0x100      
3370: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
3380: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
3390: 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ms */.#define WO
33a0: 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20  _AND    0x200   
33b0: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
33c0: 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  re AND-connected
33d0: 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e   terms */.#defin
33e0: 65 20 57 4f 5f 45 51 55 49 56 20 20 30 78 34 30  e WO_EQUIV  0x40
33f0: 30 20 20 20 20 20 20 20 2f 2a 20 4f 66 20 74 68  0       /* Of th
3400: 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74  e form A==B, bot
3410: 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65  h columns */.#de
3420: 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30  fine WO_NOOP   0
3430: 78 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68  x800       /* Th
3440: 69 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  is term does not
3450: 20 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68   restrict search
3460: 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69   space */..#defi
3470: 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66  ne WO_ALL    0xf
3480: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
3490: 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65   of all possible
34a0: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
34b0: 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c  #define WO_SINGL
34c0: 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a  E 0x0ff       /*
34d0: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e   Mask of all non
34e0: 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76  -compound WO_* v
34f0: 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alues */../*.** 
3500: 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67  Value for wsFlag
3510: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65  s returned by be
3520: 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74  stIndex() and st
3530: 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65  ored in.** Where
3540: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20  Level.wsFlags.  
3550: 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74 65  These flags dete
3560: 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61 72  rmine which sear
3570: 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73  ch.** strategies
3580: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
3590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ..*/.#define WHE
35a0: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
35b0: 30 78 30 30 30 30 30 30 30 31 20 20 2f 2a 20 78  0x00000001  /* x
35c0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
35d0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
35e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
35f0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
3600: 78 30 30 30 30 30 30 30 32 20 20 2f 2a 20 78 3c  x00000002  /* x<
3610: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
3620: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
3630: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
3640: 20 30 78 30 30 30 30 30 30 30 34 20 20 2f 2a 20   0x00000004  /* 
3650: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
3660: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
3670: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 30 30  MN_NULL  0x00000
3680: 30 30 38 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  008  /* x IS NUL
3690: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
36a0: 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 20  RE_CONSTRAINT   
36b0: 30 78 30 30 30 30 30 30 30 66 20 20 2f 2a 20 41  0x0000000f  /* A
36c0: 6e 79 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ny of the WHERE_
36d0: 43 4f 4c 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65  COLUMN_xxx value
36e0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
36f0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
3700: 30 78 30 30 30 30 30 30 31 30 20 20 2f 2a 20 78  0x00000010  /* x
3710: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
3720: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
3730: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
3740: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
3750: 30 30 32 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0020  /* x>EXPR 
3760: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
3770: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
3780: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
3790: 54 20 20 20 30 78 30 30 30 30 30 30 33 30 20 20  T   0x00000030  
37a0: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
37b0: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
37c0: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
37d0: 4e 4c 59 20 20 20 20 20 30 78 30 30 30 30 30 30  NLY     0x000000
37e0: 34 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  40  /* Use index
37f0: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
3800: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
3810: 45 52 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20  ERE_IPK         
3820: 20 30 78 30 30 30 30 30 31 30 30 20 20 2f 2a 20   0x00000100  /* 
3830: 78 20 69 73 20 74 68 65 20 49 4e 54 45 47 45 52  x is the INTEGER
3840: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
3850: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
3860: 44 45 58 45 44 20 20 20 20 20 20 30 78 30 30 30  DEXED      0x000
3870: 30 30 32 30 30 20 20 2f 2a 20 57 68 65 72 65 4c  00200  /* WhereL
3880: 6f 6f 70 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64  oop.u.btree.pInd
3890: 65 78 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23  ex is valid */.#
38a0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52  define WHERE_VIR
38b0: 54 55 41 4c 54 41 42 4c 45 20 30 78 30 30 30 30  TUALTABLE 0x0000
38c0: 30 34 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f  0400  /* WhereLo
38d0: 6f 70 2e 75 2e 76 74 61 62 20 69 73 20 76 61 6c  op.u.vtab is val
38e0: 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  id */.#define WH
38f0: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
3900: 20 30 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20   0x00000800  /* 
3910: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
3920: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
3930: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3940: 4f 4e 45 52 4f 57 20 20 20 20 20 20 20 30 78 30  ONEROW       0x0
3950: 30 30 30 31 30 30 30 20 20 2f 2a 20 53 65 6c 65  0001000  /* Sele
3960: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
3970: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66   one row */.#def
3980: 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ine WHERE_MULTI_
3990: 4f 52 20 20 20 20 20 30 78 30 30 30 30 32 30 30  OR     0x0000200
39a0: 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d  0  /* OR using m
39b0: 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20  ultiple indices 
39c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
39d0: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78  _TEMP_INDEX   0x
39e0: 30 30 30 30 34 30 30 30 20 20 2f 2a 20 55 73 65  00004000  /* Use
39f0: 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  s an ephemeral i
3a00: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
3a10: 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
3a20: 20 20 20 30 78 30 30 30 30 38 30 30 30 20 20 2f     0x00008000  /
3a30: 2a 20 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  * Full scan of a
3a40: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
3a50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
3a60: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
3a70: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
3a80: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
3a90: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3aa0: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
3ab0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3ac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
3ad0: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
3ae0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
3af0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3b10: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
3b20: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
3b30: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a  t *pMaskSet,  /*
3b40: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
3b50: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
3b60: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
3b70: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
3b80: 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
3b90: 4d 69 67 68 74 20 69 6e 63 6c 75 64 65 20 57 48  Might include WH
3ba0: 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_AND_ONLY */.
3bb0: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
3bc0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
3bd0: 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61  ->pMaskSet = pMa
3be0: 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 70 4f  skSet;.  pWC->pO
3bf0: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
3c00: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
3c10: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
3c20: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
3c30: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
3c40: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
3c50: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  WC->wctrlFlags =
3c60: 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a   wctrlFlags;.}..
3c70: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3c80: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
3c90: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
3ca0: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
3cb0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
3cc0: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
3cd0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ce0: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
3cf0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
3d00: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
3d10: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3d20: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
3d30: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
3d40: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
3d50: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3d60: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3d70: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
3d80: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
3d90: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
3da0: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
3db0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
3dc0: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
3dd0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
3de0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
3df0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
3e00: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
3e10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3e20: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
3e30: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
3e40: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
3e50: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3e60: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3e70: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
3e80: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
3e90: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
3ea0: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
3eb0: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
3ec0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
3ed0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
3ee0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
3ef0: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
3f00: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
3f10: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
3f20: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
3f30: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
3f40: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
3f50: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
3f60: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
3f70: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
3f80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3f90: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3fb0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
3fc0: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
3fd0: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
3fe0: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
3ff0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
4000: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
4010: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
4020: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
4030: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
4040: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
4050: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
4060: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
4070: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
4080: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
4090: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
40a0: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
40b0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
40c0: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
40d0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
40e0: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
40f0: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
4100: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
4110: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
4120: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
4130: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
4140: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
4150: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
4160: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
4170: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
4180: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
4190: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
41a0: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
41b0: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
41c0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
41d0: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
41e0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
41f0: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
4200: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
4210: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
4220: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
4230: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
4240: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
4250: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4260: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
4270: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4280: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
4290: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
42a0: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
42b0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
42c0: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
42d0: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
42e0: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
42f0: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
4300: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
4310: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
4320: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
4330: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
4340: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
4350: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
4360: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
4370: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
4380: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
4390: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
43a0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
43b0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
43c0: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
43d0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
43e0: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
43f0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
4400: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
4410: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
4420: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
4430: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
4440: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
4450: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
4460: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
4470: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
4480: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
4490: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
44a0: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
44b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
44c0: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
44d0: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
44e0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
44f0: 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30   );  /* EV: R-00
4500: 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69  211-15100 */.  i
4510: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
4520: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
4530: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
4540: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
4550: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
4560: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
4570: 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74    pWC->a = sqlit
4580: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4590: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
45a0: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
45b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
45c0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >a==0 ){.      i
45d0: 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  f( wtFlags & TER
45e0: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
45f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4600: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
4610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43       }.      pWC
4620: 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20  ->a = pOld;.    
4630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4640: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43  }.    memcpy(pWC
4650: 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f  ->a, pOld, sizeo
4660: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
4670: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  ->nTerm);.    if
4680: 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74  ( pOld!=pWC->aSt
4690: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71  atic ){.      sq
46a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
46b0: 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pOld);.    }.   
46c0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71   pWC->nSlot = sq
46d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
46e0: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69  e(db, pWC->a)/si
46f0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b  zeof(pWC->a[0]);
4700: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
4710: 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43  pWC->a[idx = pWC
4720: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54  ->nTerm++];.  pT
4730: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  erm->pExpr = sql
4740: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
4750: 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d  ate(p);.  pTerm-
4760: 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61  >wtFlags = wtFla
4770: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
4780: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
4790: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
47a0: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
47b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
47c0: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
47d0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
47e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
47f0: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
4800: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
4810: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
4820: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
4830: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
4840: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
4850: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
4860: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
4870: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
4880: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
4890: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
48a0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
48b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
48c0: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
48d0: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
48e0: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
48f0: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
4900: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
4910: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
4920: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
4930: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
4940: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
4950: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
4960: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
4970: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
4980: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
4990: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
49a0: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
49b0: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
49c0: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
49d0: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
49e0: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
49f0: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
4a00: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
4a10: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
4a20: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
4a30: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
4a40: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
4a50: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
4a60: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
4a70: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
4a80: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
4a90: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
4aa0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
4ab0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
4ac0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
4ad0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c  ic void whereSpl
4ae0: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
4af0: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
4b00: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43  , int op){.  pWC
4b10: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
4b20: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
4b30: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
4b40: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
4b50: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
4b60: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
4b70: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
4b80: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
4b90: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4ba0: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
4bb0: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
4bc0: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
4bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
4be0: 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69  lize an expressi
4bf0: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57  on mask set (a W
4c00: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
4c10: 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ct).*/.#define i
4c20: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d  nitMaskSet(P)  m
4c30: 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65  emset(P, 0, size
4c40: 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52  of(*P))../*.** R
4c50: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
4c60: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
4c70: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
4c80: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
4c90: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
4ca0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
4cb0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
4cc0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
4cd0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
4ce0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
4cf0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
4d00: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
4d10: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
4d20: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
4d30: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
4d40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
4d50: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
4d60: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
4d70: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
4d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4d90: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4da0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
4db0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
4dc0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
4dd0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
4de0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
4df0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
4e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
4e10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
4e20: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
4e30: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
4e40: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
4e50: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4e60: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
4e70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
4e80: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
4e90: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
4ea0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
4ec0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
4ed0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4ee0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
4ef0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
4f00: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
4f10: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
4f20: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
4f30: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
4f40: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
4f50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4f60: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
4f70: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
4f80: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
4f90: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
4fa0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
4fb0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
4fc0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
4fd0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
4fe0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
4ff0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
5000: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
5010: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
5020: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
5030: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
5040: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
5050: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
5060: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
5070: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
5080: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
5090: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
50a0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
50b0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52  .** The sqlite3R
50c0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
50d0: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
50e0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
50f0: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
5100: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
5110: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
5120: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
5130: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
5140: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
5150: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
5160: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
5170: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
5180: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
5190: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
51a0: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
51b0: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
51c0: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
51d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
51e0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
51f0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
5200: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
5210: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
5220: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
5230: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
5240: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
5250: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
5260: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
5270: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
5280: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
5290: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
52a0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
52b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
52c0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
52d0: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
52e0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
52f0: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
5300: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
5310: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
5320: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
5330: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
5340: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
5350: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
5360: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
5370: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5380: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5390: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
53a0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
53b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
53c0: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
53d0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
53e0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
53f0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
5400: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
5410: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5420: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
5430: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
5440: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
5450: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
5460: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
5470: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
5480: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
5490: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
54a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
54b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
54c0: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
54d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
54e0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
54f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
5500: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5510: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
5520: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
5530: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
5540: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
5550: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
5560: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
5570: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
5580: 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  S ){.    SrcList
5590: 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72   *pSrc = pS->pSr
55a0: 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  c;.    mask |= e
55b0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
55c0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
55d0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73  pEList);.    mas
55e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
55f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5600: 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b  , pS->pGroupBy);
5610: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
5620: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
5630: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f  pMaskSet, pS->pO
5640: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73  rderBy);.    mas
5650: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
5660: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5670: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d  ->pWhere);.    m
5680: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5690: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
56a0: 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  pS->pHaving);.  
56b0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
56c0: 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  c!=0) ){.      i
56d0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
56e0: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
56f0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
5700: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
5710: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
5720: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
5730: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
5740: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
5750: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
5760: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
5770: 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pOn);.      }. 
5780: 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53     }.    pS = pS
5790: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
57a0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
57b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
57c0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
57d0: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
57e0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
57f0: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
5800: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
5810: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
5820: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
5830: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
5840: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
5850: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
5860: 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  and "IN"..**.** 
5870: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
5880: 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33  F: R-59926-26393
5890: 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79   To be usable by
58a0: 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d   an index a term
58b0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f   must be.** of o
58c0: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
58d0: 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d  ing forms: colum
58e0: 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63  n = expression c
58f0: 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69  olumn > expressi
5900: 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20  on.** column >= 
5910: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d  expression colum
5920: 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63  n < expression c
5930: 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73  olumn <= express
5940: 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ion.** expressio
5950: 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  n = column expre
5960: 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65  ssion > column e
5970: 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c  xpression >= col
5980: 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  umn.** expressio
5990: 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  n < column expre
59a0: 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20  ssion <= column 
59b0: 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78  column IN.** (ex
59c0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63  pression-list) c
59d0: 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65  olumn IN (subque
59e0: 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55  ry) column IS NU
59f0: 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  LL.*/.static int
5a00: 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f   allowedOp(int o
5a10: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b  p){.  assert( TK
5a20: 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _GT>TK_EQ && TK_
5a30: 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  GT<TK_GE );.  as
5a40: 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45  sert( TK_LT>TK_E
5a50: 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45  Q && TK_LT<TK_GE
5a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
5a70: 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LE>TK_EQ && TK_
5a80: 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LE<TK_GE );.  as
5a90: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
5aa0: 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e  EQ+4 );.  return
5ab0: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f   op==TK_IN || (o
5ac0: 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d  p>=TK_EQ && op<=
5ad0: 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_GE) || op==TK
5ae0: 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _ISNULL;.}../*.*
5af0: 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63  * Swap two objec
5b00: 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e  ts of type TYPE.
5b10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
5b20: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
5b30: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
5b40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
5b50: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
5b60: 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69  rator.  Expressi
5b70: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ons of the form 
5b80: 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20  "X op Y".** are 
5b90: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22  converted into "
5ba0: 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49  Y op X"..**.** I
5bb0: 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65  f left/right pre
5bc0: 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f  cedence rules co
5bd0: 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65  me into play whe
5be0: 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68  n determining th
5bf0: 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  e.** collating.*
5c00: 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  * side of the co
5c10: 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d  mparison, it rem
5c20: 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ains associated 
5c30: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69  with the same si
5c40: 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  de after.** the 
5c50: 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20  commutation. So 
5c60: 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "Y collate NOCAS
5c70: 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20  E op X" becomes 
5c80: 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e 20 54 68  .** "X op Y". Th
5c90: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
5ca0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
5cb0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
5cc0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
5cd0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
5ce0: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
5cf0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
5d00: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
5d10: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
5d20: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
5d30: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
5d40: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
5d50: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
5d60: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
5d70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5d80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5d90: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
5da0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
5db0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
5dc0: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
5dd0: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
5de0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
5df0: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
5e00: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
5e10: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
5e20: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
5e30: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
5e40: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
5e50: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
5e60: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
5e70: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
5e80: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
5e90: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
5ea0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
5eb0: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
5ec0: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
5ed0: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
5ee0: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
5ef0: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
5f00: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
5f10: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
5f20: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
5f30: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
5f40: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
5f50: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
5f60: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5f70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
5f80: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
5f90: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
5fa0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
5fb0: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
5fc0: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
5fd0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
5fe0: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
5ff0: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
6000: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
6010: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
6020: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
6030: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
6040: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
6050: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
6060: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
6070: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
6080: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
6090: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
60a0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
60b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
60c0: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
60d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
60e0: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
60f0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
6100: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
6110: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
6120: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
6130: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
6140: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
6150: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
6160: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
6170: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
6180: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
6190: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
61a0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
61b0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
61c0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
61d0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
61e0: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
61f0: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
6200: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
6210: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
6220: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
6230: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
6240: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
6250: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
6260: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6270: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
6280: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
6290: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
62a0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
62b0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
62c0: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
62d0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
62e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
62f0: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
6300: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
6310: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
6320: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
6330: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
6340: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
6350: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
6360: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
6370: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
6380: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
6390: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
63a0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
63b0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
63d0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
63e0: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
63f0: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
6400: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
6410: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
6420: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
6430: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
6440: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
6450: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
6460: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
6470: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
6480: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
6490: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77  .*/.WhereTerm *w
64a0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
64b0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
64c0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
64d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
64e0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
64f0: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
6500: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
6510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
6520: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
6530: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
6540: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
6550: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
6560: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
6570: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
6580: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
6590: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
65a0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
65b0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
65c0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
65d0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
65e0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 0a 20 20 77  g tested */..  w
65f0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
6600: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
6610: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
6620: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
6630: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b  Scan->iEquiv-2];
6640: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
6650: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63  Scan->aEquiv[pSc
6660: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
6670: 20 20 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d     while( (pWC =
6680: 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20   pScan->pWC)!=0 
6690: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  ){.      for(pTe
66a0: 72 6d 3d 70 57 43 2d 3e 61 2b 70 53 63 61 6e 2d  rm=pWC->a+pScan-
66b0: 3e 6b 3b 20 70 53 63 61 6e 2d 3e 6b 3c 70 57 43  >k; pScan->k<pWC
66c0: 2d 3e 6e 54 65 72 6d 3b 20 70 53 63 61 6e 2d 3e  ->nTerm; pScan->
66d0: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
66e0: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
66f0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
6700: 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c  ur && pTerm->u.l
6710: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
6720: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
6730: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
6740: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
6750: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
6760: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
6770: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
6780: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
6790: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
67a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
67b0: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
67c0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
67d0: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
67e0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
67f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
6800: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
6810: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
6820: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
6830: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6850: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
6860: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
6880: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
6890: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
68b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
68d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
68e0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
68f0: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
6910: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
6920: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
6930: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
6940: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
6950: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6960: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
6970: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
6980: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
69a0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
69b0: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
69c0: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
69d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
69e0: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
69f0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
6a00: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
6a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6a20: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
6a30: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
6a40: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
6a50: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
6a60: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6a70: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
6a80: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
6a90: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6aa0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
6ab0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
6ac0: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
6ad0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
6ae0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6af0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
6b00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
6b10: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
6b20: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
6b30: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6b40: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
6b50: 6c 6c 53 65 71 28 70 57 43 2d 3e 70 50 61 72 73  llSeq(pWC->pPars
6b60: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20       pX->pLeft, 
6ba0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
6bb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
6bc0: 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
6bd0: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
6be0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6c00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6c10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
6c20: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
6c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
6c80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6c90: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
6ca0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
6cb0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
6cc0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
6cd0: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
6ce0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
6cf0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
6d10: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
6d20: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
6d30: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
6d40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
6d50: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
6d60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
6d70: 53 63 61 6e 2d 3e 70 43 75 72 72 65 6e 74 20 3d  Scan->pCurrent =
6d80: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
6d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 2b 2b 3b 0a      pScan->k++;.
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
6db0: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
6dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
6de0: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  C = pScan->pWC =
6df0: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
6e00: 74 65 72 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ter;.      pScan
6e10: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ->k = 0;.    }. 
6e20: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
6e30: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
6e40: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30      pScan->k = 0
6e50: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
6e60: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
6e70: 70 53 63 61 6e 2d 3e 70 43 75 72 72 65 6e 74 20  pScan->pCurrent 
6e80: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  = 0;.  return 0;
6e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
6ea0: 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61  lize a WHERE cla
6eb0: 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65  use scanner obje
6ec0: 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ct.  Return a po
6ed0: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
6ee0: 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65  first match.  Re
6ef0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
6f00: 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65  re are no matche
6f10: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61  s..**.** The sca
6f20: 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61  nner will be sea
6f30: 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45  rching the WHERE
6f40: 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74   clause pWC.  It
6f50: 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f   will look.** fo
6f60: 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  r terms of the f
6f70: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
6f80: 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63  r>" where X is c
6f90: 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66  olumn iColumn of
6fa0: 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20   table.** iCur. 
6fb0: 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62   The <op> must b
6fc0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  e one of the ope
6fd0: 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64  rators described
6fe0: 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a   by opMask..**.*
6ff0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
7000: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
7010: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
7020: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
7030: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
7040: 64 78 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  dx..*/.WhereTerm
7050: 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28   *whereScanInit(
7060: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53  .  WhereScan *pS
7070: 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  can,       /* Th
7080: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
7090: 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ct being initial
70a0: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  ized */.  WhereC
70b0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
70c0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
70d0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e  lause to be scan
70e0: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ned */.  int iCu
70f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7100: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
7110: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  an for */.  int 
7120: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
7130: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
7140: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75   scan for */.  u
7150: 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20  32 opMask,      
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
7170: 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f  or(s) to scan fo
7180: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
7190: 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx             /
71a0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
71b0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
71c0: 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
71d0: 20 6a 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 53   j;..  memset(pS
71e0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
71f0: 70 53 63 61 6e 29 29 3b 0a 20 20 70 53 63 61 6e  pScan));.  pScan
7200: 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b  ->pOrigWC = pWC;
7210: 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20  .  pScan->pWC = 
7220: 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20  pWC;.  if( pIdx 
7230: 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  && iColumn>=0 ){
7240: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
7250: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
7260: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
7270: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 66  .affinity;.    f
7280: 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69  or(j=0; pIdx->ai
7290: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
72a0: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
72b0: 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64  if( NEVER(j>=pId
72c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65  x->nColumn) ) re
72d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
72e0: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
72f0: 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  me = pIdx->azCol
7300: 6c 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 70 53 63 61  l[j];.  }.  pSca
7310: 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61  n->opMask = opMa
7320: 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  sk;.  pScan->aEq
7330: 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20  uiv[0] = iCur;. 
7340: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31   pScan->aEquiv[1
7350: 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  ] = iColumn;.  p
7360: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32  Scan->nEquiv = 2
7370: 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69  ;.  pScan->iEqui
7380: 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20  v = 2;.  return 
7390: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53  whereScanNext(pS
73a0: 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  can);.}../*.** S
73b0: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
73c0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
73d0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
73e0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
73f0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
7400: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
7410: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
7420: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
7430: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
7440: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
7450: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
7460: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
7470: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
7480: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
7490: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
74a0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
74b0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  found..**.** The
74c0: 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d   term returned m
74d0: 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e  ight by Y=<expr>
74e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f   if there is ano
74f0: 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20  ther constraint 
7500: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
7510: 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63  clause that spec
7520: 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20  ifies that X=Y. 
7530: 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72   Any such constr
7540: 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  aints will be.**
7550: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
7560: 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20  he WO_EQUIV bit 
7570: 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f  in the pTerm->eO
7580: 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20  perator field.  
7590: 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20  The.** aEquiv[] 
75a0: 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61 6e  array holds X an
75b0: 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61  d all its equiva
75c0: 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63 68  lents, with each
75d0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a   SQL variable.**
75e0: 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20 73   taking up two s
75f0: 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d  lots in aEquiv[]
7600: 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c 6f  .  The first slo
7610: 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75 72  t is for the cur
7620: 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e  sor number.** an
7630: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  d the second is 
7640: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
7650: 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61 72  umber.  There ar
7660: 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61 45  e 22 slots in aE
7670: 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61  quiv[].** so tha
7680: 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c  t means we can l
7690: 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75  ook for X plus u
76a0: 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65 71  p to 10 other eq
76b0: 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e  uivalent values.
76c0: 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61 72  .** Hence a sear
76d0: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
76e0: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
76f0: 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61 6e  =A1 and A1=A2 an
7700: 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e  d A2=A3.** and .
7710: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
7720: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
7730: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
7740: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
7750: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
7760: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
7770: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
7780: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
7790: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
77a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
77b0: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
77c0: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
77d0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
77e0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
77f0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
7800: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
7810: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
7820: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
7830: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
7840: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
7850: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
7860: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
7870: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
7880: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
7890: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
78a0: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
78b0: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
78c0: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
78d0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
78e0: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69  _EQUIV..*/.stati
78f0: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e  c WhereTerm *fin
7900: 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c  dTerm(.  WhereCl
7910: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
7920: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
7930: 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  se to be searche
7940: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
7970: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43   LHS */.  int iC
7980: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
7990: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
79a0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74   of LHS */.  Bit
79b0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
79c0: 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e     /* RHS must n
79d0: 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20  ot overlap with 
79e0: 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75  this mask */.  u
79f0: 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  32 op,          
7a00: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
7a10: 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73  WO_xx values des
7a20: 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72  cribing operator
7a30: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
7a40: 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x           /* M
7a50: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
7a60: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
7a70: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
7a80: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
7a90: 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20   *pResult = 0;. 
7aa0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20   WhereTerm *p;. 
7ab0: 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
7ac0: 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63 61  ..  p = whereSca
7ad0: 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43  nInit(&scan, pWC
7ae0: 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c  , iCur, iColumn,
7af0: 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 77 68   op, pIdx);.  wh
7b00: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
7b10: 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68  ( (p->prereqRigh
7b20: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
7b30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
7b40: 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20  >prereqRight==0 
7b50: 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72  && (p->eOperator
7b60: 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20  &WO_EQ)!=0 ){.  
7b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
7b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7b90: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
7ba0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
7bb0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
7bc0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
7bd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
7be0: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  sult;.}../* Forw
7bf0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
7c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7c10: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
7c20: 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c  *, WhereClause*,
7c30: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   int);../*.** Ca
7c40: 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f  ll exprAnalyze o
7c50: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61  n all terms in a
7c60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
7c70: 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .**.**.*/.static
7c80: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
7c90: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
7ca0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
7cb0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
7cc0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
7cd0: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
7ce0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
7cf0: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
7d00: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
7d10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
7d20: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
7d30: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
7d40: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
7d50: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
7d60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d70: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
7d80: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
7d90: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
7da0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
7db0: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
7dc0: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
7dd0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
7de0: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
7df0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
7e00: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
7e10: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
7e20: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
7e30: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
7e40: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
7e50: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
7e60: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
7e70: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
7e80: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
7e90: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
7ea0: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
7eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
7ec0: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
7ed0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
7ee0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
7ef0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
7f00: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
7f10: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
7f20: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
7f30: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
7f40: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
7f50: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
7f60: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
7f70: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
7f80: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
7f90: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
7fa0: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
7fb0: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
7fc0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
7fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
7fe0: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
7ff0: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
8000: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
8010: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
8020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
8030: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
8040: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
8050: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
8060: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
8070: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
8080: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
8090: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
80a0: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
80b0: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
80c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
80d0: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
80e0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
80f0: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8110: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
8120: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
8130: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
8140: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8150: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
8160: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
8170: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
8180: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8190: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
81a0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
81b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
81c0: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
81d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
81e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
81f0: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
8200: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
8210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8220: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
8230: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
8240: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
8250: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
8260: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
8270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
8280: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
8290: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
82a0: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
82b0: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
82c0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
82d0: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
82e0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
82f0: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
8300: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
8310: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8320: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
8330: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
8340: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
8350: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
8360: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
8370: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
8380: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
8390: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
83a0: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
83b0: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
83c0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
83d0: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
83e0: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
83f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
8400: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
8410: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
8420: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
8430: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
8440: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
8450: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
8460: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
8470: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
8480: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
8490: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
84a0: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
84b0: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
84c0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
84d0: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
84e0: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
84f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
8500: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
8510: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
8520: 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65 70  dbeGetValue(pRep
8530: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
8540: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
8550: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
8560: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8570: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
8580: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
8590: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
85a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
85b0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
85c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
85d0: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
85e0: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
85f0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
8600: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
8610: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
8620: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
8630: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
8640: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
8650: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
8660: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
8670: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
8680: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
8690: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
86a0: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
86b0: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
86c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
86d0: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
86e0: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
86f0: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
8700: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
8710: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
8720: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
8730: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
8740: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
8750: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
8760: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
8770: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
8780: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
8790: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
87a0: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
87b0: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
87c0: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
87d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
87e0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
87f0: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
8800: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
8810: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
8820: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
8830: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
8840: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
8850: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
8860: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
8870: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
8880: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
8890: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
88a0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
88b0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
88c0: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
88d0: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
88e0: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
88f0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
8900: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
8910: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
8920: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
8930: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
8940: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
8950: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
8960: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
8970: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
8980: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
8990: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
89a0: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
89b0: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
89c0: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
89d0: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
89e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
89f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
8a00: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
8a10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8a20: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
8a30: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
8a40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
8a60: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
8a70: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
8a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
8a90: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8aa0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
8ab0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8ac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
8ad0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
8ae0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
8af0: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
8b00: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
8b10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8b20: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
8b30: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
8b40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8b50: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
8b60: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
8b70: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
8b80: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
8b90: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
8ba0: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
8bb0: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
8bc0: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
8bd0: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
8be0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
8bf0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
8c00: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
8c10: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
8c20: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
8c30: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
8c40: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
8c50: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
8c60: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
8c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8c80: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
8c90: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
8ca0: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
8cb0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
8cc0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
8cd0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
8ce0: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
8cf0: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
8d00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8d10: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
8d20: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
8d30: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
8d40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
8d50: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
8d60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8d70: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
8d80: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
8d90: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
8da0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
8db0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
8dc0: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
8dd0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
8de0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8df0: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
8e00: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
8e10: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
8e20: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
8e30: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
8e40: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
8e50: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
8e60: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
8e70: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
8e80: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
8e90: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
8ea0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
8eb0: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
8ec0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
8ed0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
8ee0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
8ef0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8f00: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
8f10: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
8f20: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
8f30: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
8f40: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
8f50: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
8f60: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
8f70: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
8f80: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
8f90: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
8fc0: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
8fd0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
8fe0: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
8ff0: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
9000: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
9010: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
9020: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
9030: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
9040: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
9050: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
9060: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
9070: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
9080: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
9090: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
90a0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
90b0: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
90c0: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
90d0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
90e0: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
90f0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
9100: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
9110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
9120: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
9130: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
9140: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
9150: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
9160: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
9170: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
9180: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
9190: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
91a0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
91b0: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
91c0: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
91d0: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
91e0: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
91f0: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
9200: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
9210: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
9220: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
9230: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
9240: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
9250: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
9260: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
9270: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
9280: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
9290: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
92a0: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
92b0: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
92c0: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
92d0: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
92e0: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
92f0: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
9300: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
9310: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
9320: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
9330: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
9340: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
9350: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
9360: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
9370: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
9380: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
9390: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
93a0: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
93b0: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
93c0: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
93d0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
93e0: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
93f0: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
9400: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
9410: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
9420: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
9430: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
9440: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
9450: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
9460: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
9470: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
9480: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
9490: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
94a0: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
94b0: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
94c0: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
94d0: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
94e0: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
9500: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
9510: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
9520: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
9530: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
9540: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
9550: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
9560: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
9570: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
9580: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
9590: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
95a0: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
95b0: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
95c0: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
95d0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
95e0: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
95f0: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
9600: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
9610: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
9620: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
9630: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
9640: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
9650: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
9660: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
9670: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
9680: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
9690: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
96a0: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
96b0: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
96c0: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
96d0: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
96e0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
96f0: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
9700: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
9710: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
9720: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
9730: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
9740: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
9750: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
9760: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
9770: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
9780: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
9790: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
97a0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
97b0: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
97c0: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
97d0: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73  ts; that.** is s
97e0: 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65 73  omething the bes
97f0: 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  tIndex() routine
9800: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e   will determine.
9810: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a    This analysis.
9820: 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  ** only looks at
9830: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
9840: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
9850: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
9860: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
9870: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
9880: 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73   above all satis
9890: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
98a0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
98b0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
98c0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
98d0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
98e0: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
98f0: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
9900: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
9910: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
9920: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
9930: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
9940: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
9950: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
9960: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
9970: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
9980: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
9990: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
99a0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
99b0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
99c0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
99d0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
99e0: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
99f0: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
9a00: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
9a10: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
9a20: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
9a30: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
9a40: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
9a50: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
9a60: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
9a70: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
9a80: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
9a90: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
9aa0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
9ab0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
9ac0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
9ad0: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
9ae0: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
9af0: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
9b00: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
9b10: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
9b20: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
9b30: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
9b40: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
9b50: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9b60: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
9b70: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
9b80: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
9b90: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
9ba0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9bb0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
9bc0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
9bd0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
9be0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
9bf0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
9c00: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
9c10: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
9c20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
9c30: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20   pWC->pParse;   
9c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9c50: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
9c60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9c70: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
9c80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9c90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9ca0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
9cb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9cc0: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
9cd0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
9ce0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
9cf0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
9d00: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
9d10: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9d20: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
9d30: 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  m */.  WhereMask
9d40: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20  Set *pMaskSet = 
9d50: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f  pWC->pMaskSet; /
9d60: 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61 73 6b  * Table use mask
9d70: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9da0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
9db0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
9dc0: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
9dd0: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
9de0: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
9df0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
9e00: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
9e10: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
9e20: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
9e30: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
9e40: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
9e50: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
9e60: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
9e70: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
9e80: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
9e90: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
9ea0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
9eb0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
9ec0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
9ed0: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
9ee0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
9ef0: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
9f00: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
9f10: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
9f20: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
9f30: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
9f40: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
9f50: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
9f60: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
9f70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
9f80: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
9f90: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
9fa0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
9fb0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
9fc0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
9fd0: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
9fe0: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
9ff0: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
a000: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
a010: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
a020: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
a030: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a040: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
a050: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
a060: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
a070: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a080: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
a090: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
a0a0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
a0b0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
a0c0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
a0d0: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
a0e0: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
a0f0: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
a100: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e  nit(pOrWc, pWC->
a110: 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
a120: 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67  , pWC->wctrlFlag
a130: 73 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  s);.  whereSplit
a140: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
a150: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
a160: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
a170: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
a180: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
a190: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
a1a0: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
a1b0: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
a1c0: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
a1d0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
a1e0: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
a1f0: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
a200: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
a210: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
a220: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
a230: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
a240: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
a250: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
a260: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
a270: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
a280: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
a290: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
a2a0: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
a2b0: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
a2c0: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
a2e0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
a2f0: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
a300: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
a310: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
a320: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
a330: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
a340: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
a350: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
a360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
a370: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
a380: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
a390: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
a3a0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
a3b0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
a3c0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
a3d0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
a3e0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
a3f0: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
a400: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
a410: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
a420: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
a430: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
a440: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
a450: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
a460: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
a470: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
a480: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
a490: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
a4a0: 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72  skSet, pWC->wctr
a4b0: 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  lFlags);.       
a4c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
a4d0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
a4e0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
a4f0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
a500: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
a510: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
a520: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
a530: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a540: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
a550: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
a560: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
a570: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
a580: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
a590: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
a5a0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
a5b0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
a5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
a5d0: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
a5e0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
a5f0: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
a600: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
a610: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
a620: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
a630: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
a640: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
a650: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
a660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
a670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a680: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
a690: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
a6a0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
a6b0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
a6c0: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
a6d0: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
a6e0: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
a6f0: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
a700: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
a710: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
a720: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
a730: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
a750: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
a760: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
a770: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
a780: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
a790: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
a7a0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
a7b0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  AL ){.        Wh
a7c0: 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
a7d0: 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54  = &pOrWc->a[pOrT
a7e0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
a7f0: 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d         b |= getM
a800: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
a810: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
a820: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a830: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
a840: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
a850: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
a860: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
a870: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
a880: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
a890: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
a8a0: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
a8b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
a8c0: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
a8d0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
a8e0: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
a8f0: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
a900: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
a910: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
a920: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
a930: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
a940: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
a950: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
a960: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
a970: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
a980: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
a990: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
a9a0: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
a9b0: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
a9c0: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
a9d0: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
a9e0: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
a9f0: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
aa00: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
aa10: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
aa20: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
aa30: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
aa40: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
aa50: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
aa60: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
aa70: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
aa80: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
aa90: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
aaa0: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
aab0: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
aac0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
aad0: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
aae0: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
aaf0: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
ab00: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
ab10: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
ab20: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
ab30: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
ab40: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
ab50: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
ab60: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
ab70: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
ab80: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
ab90: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
aba0: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
abb0: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
abc0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
abd0: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
abe0: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
abf0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
ac00: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
ac10: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
ac20: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
ac30: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
ac40: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
ac50: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
ac60: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
ac70: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
ac80: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
ac90: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
aca0: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
acb0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
acc0: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
acd0: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
ace0: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
acf0: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
ad00: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
ad10: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
ad20: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
ad30: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
ad40: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
ad50: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
ad60: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
ad70: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
ad80: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
ad90: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
ada0: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
adb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
adc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
add0: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
ade0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
adf0: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
ae00: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
ae10: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
ae20: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
ae30: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
ae40: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
ae50: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
ae60: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
ae70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
ae80: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
ae90: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
aea0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aec0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aed0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
aee0: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
aef0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
af00: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
af10: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
af20: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
af30: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
af40: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
af50: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
af60: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
af70: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
af80: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
af90: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
afa0: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
afb0: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
afc0: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
afd0: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
afe0: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
aff0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
b000: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
b010: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
b020: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
b030: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
b040: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
b050: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
b060: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
b070: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
b080: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
b090: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
b0a0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
b0b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
b0c0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
b0d0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
b0e0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
b0f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
b100: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
b110: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
b120: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
b130: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
b140: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
b150: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
b160: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
b170: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
b180: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
b190: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
b1a0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
b1b0: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
b1c0: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
b1d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b1e0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
b1f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
b200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b210: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
b220: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
b230: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
b240: 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20  ursor))==0 ){.  
b250: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b260: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20  term must be of 
b270: 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74  the form t1.a==t
b280: 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20  2.b where t2 is 
b290: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
b2a0: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74   ** chngToIN set
b2b0: 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20   but t1 is not. 
b2c0: 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20   This term will 
b2d0: 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65 65  be either precee
b2e0: 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ded.          **
b2f0: 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61   or follwed by a
b300: 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20  n inverted copy 
b310: 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53  (t2.b==t1.a).  S
b320: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20  kip this term . 
b330: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
b340: 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f  use its inversio
b350: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
b360: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
b370: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
b380: 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20  M_COPIED );.    
b390: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b3a0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b3b0: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
b3c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
b3d0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ert( pOrTerm->wt
b3e0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
b3f0: 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41  PIED|TERM_VIRTUA
b400: 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  L) );.          
b410: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b420: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c    }.        iCol
b430: 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75  umn = pOrTerm->u
b440: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
b450: 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70       iCursor = p
b460: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
b470: 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  or;.        brea
b480: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b490: 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
b4a0: 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64      /* No candid
b4b0: 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e  ate table+column
b4c0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69   was found.  Thi
b4d0: 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
b4e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
b4f0: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
b500: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ion */.        a
b510: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
b520: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
b530: 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67  sPowerOfTwo(chng
b540: 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20  ToIN) );.       
b550: 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49   assert( chngToI
b560: 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  N==getMask(pMask
b570: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
b580: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
b5a0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
b5b0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
b5c0: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
b5d0: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
b5e0: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
b5f0: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
b600: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
b610: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
b620: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
b630: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
b640: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
b650: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
b660: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
b670: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
b680: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
b690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
b6a0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b6b0: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
b6c0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
b6d0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
b6e0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
b6f0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
b700: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
b710: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
b720: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
b730: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
b740: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
b750: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
b760: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b770: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
b780: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
b790: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
b7a0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
b7b0: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
b7c0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
b7d0: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
b7e0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
b7f0: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
b800: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
b810: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
b820: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
b830: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
b840: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
b850: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
b860: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
b870: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
b880: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
b890: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
b8a0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
b8b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
b8c0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
b8d0: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
b8e0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b900: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
b910: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
b920: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
b930: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
b940: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
b950: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b960: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b970: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
b980: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b990: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
b9b0: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
b9c0: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
b9d0: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
b9e0: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
b9f0: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
ba00: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
ba10: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
ba20: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
ba30: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
ba40: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
ba50: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
ba60: 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d  **.    ** EV: R-
ba70: 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20  00211-15100.    
ba80: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
ba90: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
baa0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
bab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
bac0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
bad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
bae0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
baf0: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
bb00: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
bb10: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
bb20: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
bb30: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
bb40: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
bb50: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
bb60: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
bb80: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
bb90: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
bba0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
bbb0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
bbc0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
bbd0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
bbe0: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
bbf0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
bc00: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
bc10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
bc20: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
bc30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
bc40: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
bc50: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
bc60: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
bc70: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
bc80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
bc90: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
bca0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
bcb0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
bcc0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
bcd0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
bce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
bcf0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
bd00: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
bd10: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
bd20: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
bd30: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
bd40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
bd50: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
bd60: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
bd70: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
bd80: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bd90: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
bda0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
bdb0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
bdc0: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
bdd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
bde0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
bdf0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
be00: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
be10: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
be20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
be30: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
be40: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
be50: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
be60: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
be70: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
be80: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
be90: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
bea0: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
beb0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
bec0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
bed0: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
bee0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
bef0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
bf00: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
bf10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
bf20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
bf30: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
bf40: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
bf50: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
bf60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
bf70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bf80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bf90: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
bfa0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
bfb0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
bfc0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
bfd0: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
bfe0: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
bff0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
c000: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
c010: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
c020: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
c030: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
c040: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
c050: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c060: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
c070: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
c080: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
c090: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
c0a0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
c0b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
c0c0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
c0d0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
c0e0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
c0f0: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
c100: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
c110: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
c120: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
c130: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
c140: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
c150: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
c160: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
c170: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
c180: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
c190: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
c1a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
c1b0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
c1c0: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
c1d0: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
c1e0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
c1f0: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
c200: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
c210: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
c220: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
c230: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
c240: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
c250: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c260: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
c270: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
c280: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
c290: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
c2a0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
c2b0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
c2c0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
c2d0: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
c2e0: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
c2f0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
c300: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
c310: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
c320: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
c330: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
c340: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
c350: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
c360: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
c370: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
c380: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
c390: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
c3a0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
c3b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
c3c0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
c3d0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
c3e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
c3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
c400: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
c410: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
c420: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
c430: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
c440: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
c450: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
c460: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
c470: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
c480: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
c490: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4b0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c4c0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
c4d0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
c4e0: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
c4f0: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
c500: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
c510: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c540: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
c550: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
c560: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
c570: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
c580: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
c590: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
c5a0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
c5b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
c5c0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
c5d0: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
c5e0: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
c5f0: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
c600: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
c610: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
c620: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
c630: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
c640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
c650: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
c660: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
c670: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c690: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
c6a0: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
c6b0: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
c6c0: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
c6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
c6e0: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
c6f0: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
c700: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
c730: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
c740: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
c750: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
c760: 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73  rse;     /* Pars
c770: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c780: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c790: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c7a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c7b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
c7c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
c7d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c7e0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
c7f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c800: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
c810: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20  pWC->pMaskSet;. 
c820: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
c830: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
c840: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
c850: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
c860: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
c870: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
c880: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
c890: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
c8a0: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
c8b0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
c8c0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
c8d0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
c8e0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
c8f0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
c900: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
c910: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
c920: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c930: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
c940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
c950: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
c960: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
c970: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
c980: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
c990: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
c9a0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
c9b0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
c9c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
c9d0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
c9e0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c9f0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
ca00: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
ca10: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
ca20: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ca30: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
ca40: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
ca50: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
ca60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ca70: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
ca80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ca90: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
caa0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
cab0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
cac0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
cad0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
cae0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
caf0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
cb00: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
cb10: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
cb20: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
cb30: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
cb60: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
cb70: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
cb80: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
cb90: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
cba0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
cbb0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
cbc0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
cbd0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
cbe0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
cbf0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
cc00: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
cc10: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
cc20: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
cc30: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
cc40: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
cc50: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
cc60: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
cc70: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
cc80: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
cc90: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
cca0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
ccb0: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
ccc0: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
ccd0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
cce0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
ccf0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
cd00: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
cd10: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
cd20: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
cd30: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
cd40: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
cd50: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
cd60: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
cd70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
cd80: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
cd90: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
cda0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cdb0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
cdc0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
cdd0: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
cde0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
cdf0: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
ce00: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
ce10: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
ce20: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
ce30: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
ce40: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
ce50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ce60: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
ce70: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
ce80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ce90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cea0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ceb0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
cec0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
ced0: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
cee0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
cef0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
cf00: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
cf10: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
cf20: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
cf30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
cf40: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
cf50: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
cf60: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
cf70: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
cf80: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
cf90: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
cfa0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
cfb0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
cfc0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
cfd0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
cfe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
cff0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
d000: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
d010: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
d020: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
d030: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
d040: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
d050: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
d060: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
d070: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
d080: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
d090: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
d0a0: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
d0b0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
d0c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
d0d0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
d0e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
d0f0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
d100: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
d110: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
d120: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
d130: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
d140: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
d150: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
d160: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
d170: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
d180: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
d190: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
d1a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
d1b0: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
d1c0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
d1d0: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
d1e0: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
d1f0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
d200: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
d210: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
d220: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
d230: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
d240: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
d250: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
d260: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
d270: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
d280: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
d290: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2a0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
d2b0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
d2c0: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
d2d0: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
d2e0: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
d2f0: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
d300: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
d310: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
d320: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
d330: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
d340: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
d350: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
d360: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
d370: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
d380: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
d390: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
d3a0: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
d3b0: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
d3c0: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
d3d0: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
d3e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
d3f0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
d400: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
d410: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
d420: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
d430: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
d440: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
d450: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
d460: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
d470: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
d480: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
d490: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
d4a0: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
d4b0: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
d4c0: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
d4d0: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
d4e0: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
d4f0: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
d500: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
d510: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
d520: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
d530: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
d540: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
d550: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
d560: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
d570: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
d580: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
d590: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
d5a0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
d5b0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d5c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
d5d0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
d5e0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
d5f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
d600: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
d610: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
d620: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
d630: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
d640: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d670: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
d680: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
d6b0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
d6c0: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
d6d0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
d6e0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
d6f0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
d700: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
d710: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
d720: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
d730: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
d740: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
d750: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
d760: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
d770: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
d780: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
d790: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
d7a0: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
d7b0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
d7c0: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
d7d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
d7e0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
d7f0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
d800: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d810: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
d820: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
d830: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d840: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
d850: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
d860: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
d870: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
d880: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
d890: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
d8a0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
d8b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
d8c0: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
d8d0: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
d8e0: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
d8f0: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
d900: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
d910: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
d920: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
d930: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d940: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
d950: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
d960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d970: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
d980: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
d990: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
d9a0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
d9b0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
d9c0: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
d9d0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
d9e0: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
d9f0: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
da00: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
da10: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
da20: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
da30: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
da40: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
da50: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
da60: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
da70: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
da80: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
da90: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
daa0: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
dab0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
dac0: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
dad0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
dae0: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
daf0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
db00: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
db10: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
db20: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
db30: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
db40: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
db50: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
db60: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
db70: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
db80: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
db90: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
dba0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
dbb0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
dbc0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
dbd0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
dbe0: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
dbf0: 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
dc00: 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
dc10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
dc20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
dc30: 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
dc40: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
dc50: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
dc60: 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
dc70: 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
dc80: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
dc90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
dca0: 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
dcb0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
dcc0: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
dcd0: 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
dce0: 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
dcf0: 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
dd00: 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
dd10: 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
dd20: 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
dd30: 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
dd40: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
dd50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
dd60: 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
dd70: 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
dd80: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
dd90: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
dda0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
ddb0: 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
ddc0: 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
ddd0: 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
dde0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
ddf0: 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
de00: 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
de10: 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
de20: 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
de30: 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
de40: 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
de50: 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
de60: 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
de70: 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
de80: 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
de90: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
dea0: 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
deb0: 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
dec0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
ded0: 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
dee0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f  omplete = 0;   /
def0: 2a 20 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38  * EV: R-64339-08
df00: 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20  207 */...       
df10: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
df20: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
df30: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
df40: 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
df50: 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a    sCollSeqName.z
df60: 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43   = noCase ? "NOC
df70: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b  ASE" : "BINARY";
df80: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
df90: 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65  e.n = 6;.    pNe
dfa0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
dfb0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
dfc0: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
dfd0: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
dfe0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
dff0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  E, .           s
e000: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
e010: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
e020: 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c  ,pNewExpr1,&sCol
e030: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
e040: 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
e050: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
e060: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
e070: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
e080: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
e090: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
e0a0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e0b0: 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
e0c0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
e0d0: 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
e0e0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
e0f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
e100: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
e110: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
e120: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
e130: 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
e140: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
e150: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
e160: 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26  arse,pNewExpr2,&
e170: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
e180: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
e190: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
e1a0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
e1b0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
e1c0: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
e1d0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
e1e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
e1f0: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
e200: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
e210: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
e220: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
e230: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
e240: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
e250: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
e260: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
e270: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
e280: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
e290: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
e2a0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
e2b0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
e2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e2d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e2e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
e2f0: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
e300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e310: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
e320: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
e330: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
e340: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
e350: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
e360: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
e370: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
e380: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
e390: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
e3a0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
e3b0: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
e3c0: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
e3d0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
e3e0: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
e3f0: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
e400: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
e410: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
e420: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
e430: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
e440: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
e450: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
e460: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
e470: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
e480: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
e490: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
e4a0: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
e4b0: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
e4c0: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
e4d0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
e4e0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
e4f0: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
e500: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
e510: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
e520: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
e530: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
e540: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
e550: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
e560: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
e570: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
e580: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
e590: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
e5a0: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
e5b0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
e5c0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
e5d0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
e5e0: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
e5f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
e620: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
e630: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
e640: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
e650: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
e660: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
e670: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
e680: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e690: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
e6a0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
e6b0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
e6c0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
e6d0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
e6e0: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
e6f0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
e700: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
e710: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
e720: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
e730: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
e740: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
e750: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
e760: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
e770: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
e780: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
e790: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
e7a0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
e7b0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
e7c0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
e7d0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
e7e0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
e7f0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
e800: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
e810: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
e820: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
e830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e840: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
e850: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e860: 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20 57 68 65  E_STAT3.  /* Whe
e870: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
e880: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
e890: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
e8a0: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
e8b0: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
e8c0: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
e8d0: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
e8e0: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
e8f0: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
e900: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
e910: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
e920: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
e930: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
e940: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
e950: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
e960: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
e970: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
e980: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
e990: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
e9a0: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
e9b0: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
e9c0: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
e9d0: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
e9e0: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
e9f0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
ea00: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
ea10: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
ea20: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
ea30: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ea40: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
ea50: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
ea60: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
ea70: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
ea80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
ea90: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
eaa0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
eab0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
eac0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
ead0: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a  iColumn>=0.  ){.
eae0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
eaf0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
eb00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
eb10: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
eb20: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
eb30: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
eb40: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
eb50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
eb60: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
eb90: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
eba0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ebc0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
ebd0: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
ebe0: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
ebf0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
ec00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ec10: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
ec40: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ec50: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
ec60: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
ec70: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
ec80: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
ec90: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
eca0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ecb0: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
ecc0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
ecd0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
ece0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ecf0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
ed00: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
ed10: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
ed20: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
ed30: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ed40: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
ed50: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
ed60: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
ed70: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
ed80: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ed90: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
eda0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
edb0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
edc0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
edd0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
ede0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
edf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
ee00: 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a  LE_STAT */..  /*
ee10: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
ee20: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
ee30: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
ee40: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
ee50: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
ee60: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
ee70: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
ee80: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
ee90: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
eea0: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
eeb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eec0: 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
eed0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
eee0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
eef0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
ef00: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
ef10: 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f  on of type TK_CO
ef20: 4c 55 4d 4e 20 74 68 61 74 20 72 65 66 65 72 73  LUMN that refers
ef30: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 63 6f 6c   to the same col
ef40: 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20  umn and.** uses 
ef50: 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
ef60: 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 73 20 74  on sequence as t
ef70: 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d  he iCol'th colum
ef80: 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
ef90: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 42 61  .** Argument iBa
efa0: 73 65 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  se is the cursor
efb0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
efc0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
efd0: 70 49 64 78 20 72 65 66 65 72 73 0a 2a 2a 20 74  pIdx refers.** t
efe0: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  o..**.** If such
eff0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
f000: 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
f010: 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
f020: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
f030: 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
f040: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
f050: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f060: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
f070: 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
f080: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
f0a0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
f0b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
f0e0: 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
f0f0: 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
f120: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
f130: 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
f140: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
f170: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
f180: 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
f1b0: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
f1c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
f1d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
f1e0: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
f1f0: 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
f200: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
f210: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
f220: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
f230: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
f240: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
f250: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
f260: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
f270: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
f280: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
f290: 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
f2a0: 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
f2b0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
f2c0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
f2d0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f2e0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
f2f0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
f300: 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
f310: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
f320: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
f330: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
f340: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
f350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f360: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
f370: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f380: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
f390: 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
f3a0: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
f3b0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
f3c0: 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
f3d0: 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  t. A DISTINCT li
f3e0: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
f3f0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
f400: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e  contains a.** UN
f410: 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74 20  IQUE index that 
f420: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
f430: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
f440: 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  e query will be 
f450: 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77  distinct.** anyw
f460: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
f470: 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
f480: 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
f490: 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73  pParse,.  SrcLis
f4a0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57  t *pTabList,.  W
f4b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
f4c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
f4d0: 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c  stinct.){.  Tabl
f4e0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
f4f0: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
f520: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
f530: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
f540: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
f550: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
f560: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
f570: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
f580: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
f590: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
f5a0: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
f5b0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
f5c0: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
f5d0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
f5e0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
f5f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
f600: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
f610: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
f620: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
f630: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
f640: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
f650: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
f660: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
f670: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
f680: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
f690: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
f6a0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
f6b0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
f6c0: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
f6d0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
f6e0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
f6f0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
f700: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
f710: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
f720: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
f730: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
f740: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
f750: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
f760: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f770: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
f780: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
f790: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
f7a0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
f7b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
f7c0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
f7d0: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
f7e0: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
f7f0: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
f800: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
f810: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
f820: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
f830: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
f840: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
f850: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
f860: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
f870: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
f880: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
f890: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
f8a0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
f8b0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
f8c0: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
f8d0: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
f8e0: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f8f0: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
f900: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
f910: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
f920: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
f930: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
f940: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
f950: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
f960: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
f970: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
f980: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
f990: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
f9a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
f9b0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
f9c0: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
f9d0: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
f9e0: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
f9f0: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
fa00: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
fa10: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
fa20: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
fa30: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
fa40: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
fa50: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
fa60: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
fa70: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
fa80: 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63  ror==OE_None ) c
fa90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
faa0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
fab0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
fac0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
fad0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
fae0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69  .      if( 0==fi
faf0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
fb00: 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61  e, iCol, ~(Bitma
fb10: 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  sk)0, WO_EQ, pId
fb20: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  x) ){.        in
fb30: 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64  t iIdxCol = find
fb40: 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c  IndexCol(pParse,
fb50: 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73   pDistinct, iBas
fb60: 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20  e, pIdx, i);.   
fb70: 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c       if( iIdxCol
fb80: 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c  <0 || pTab->aCol
fb90: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
fba0: 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  i]].notNull==0 )
fbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
fbc0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fbd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fbe0: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( i==pIdx->nCol
fbf0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  umn ){.      /* 
fc00: 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69  This index impli
fc10: 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54  es that the DIST
fc20: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69  INCT qualifier i
fc30: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
fc40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
fc50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
fc60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fc70: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
fc80: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
fc90: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
fca0: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
fcb0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
fcc0: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
fcd0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
fce0: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
fcf0: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
fd00: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
fd10: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
fd20: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
fd30: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
fd40: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
fd50: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
fd60: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
fd70: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
fd80: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
fd90: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
fda0: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
fdb0: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
fdc0: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
fdd0: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
fde0: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
fdf0: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
fe00: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
fe10: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
fe20: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
fe30: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
fe40: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
fe50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fe60: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
fe70: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
fe80: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
fe90: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
fea0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
feb0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
fec0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
fed0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
fee0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
fef0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
ff00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
ff10: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
ff20: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
ff30: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
ff40: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
ff50: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
ff60: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
ff70: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
ff80: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
ff90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ffa0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
ffb0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
ffc0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ffd0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
ffe0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
fff0: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
10000 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
10010 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
10020 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
10030 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
10040 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
10050 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
10060 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
10070 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
10080 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
10090 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
100a0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
100b0 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
100c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
100d0 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
100e0 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
100f0 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
10100 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
10110 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
10120 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
10130 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
10140 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
10150 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
10160 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
10170 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
10180 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
10190 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
101a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
101b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
101c0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
101d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
101e0 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
101f0 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
10200 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
10210 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
10220 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
10230 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
10240 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
10250 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
10260 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
10270 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
10280 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
10290 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
102a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
102b0 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
102c0 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
102d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
102e0 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
102f0 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
10300 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
10310 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10320 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
10330 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
10340 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a  timatedCost);.}.
10350 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
10360 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
10370 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
10380 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
10390 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
103a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
103b0 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
103c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
103d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
103e0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
103f0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
10400 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
10410 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
10420 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
10430 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
10440 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
10450 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
10460 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
10470 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
10480 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
104b0 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
104c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
104d0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
104e0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
104f0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
10500 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
10510 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
10520 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
10530 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
10540 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
10550 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
10560 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
10570 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
10580 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
10590 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
105a0 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
105b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
105c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
105d0 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
105e0 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
105f0 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
10600 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29  u.leftColumn<0 )
10610 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66   return 0;.  aff
10620 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61   = pSrc->pTab->a
10630 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  Col[pTerm->u.lef
10640 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  tColumn].affinit
10650 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  y;.  if( !sqlite
10660 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
10670 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61  (pTerm->pExpr, a
10680 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ff) ) return 0;.
10690 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
106a0 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
106b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
106c0 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
106d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
106e0 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
106f0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
10700 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
10710 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
10720 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
10730 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
10740 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
10750 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
10760 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
10770 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10790 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
107a0 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
107b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
107c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
107d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
107e0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
107f0 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
10800 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
10810 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
10820 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
10830 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
10840 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
10850 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
10860 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
10870 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
10880 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
10890 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
108a0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
108b0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
108c0 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
108d0 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
108e0 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
108f0 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt nColumn;     
10900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10910 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10920 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
10930 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
10940 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
10950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
10960 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
10970 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
10980 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
10990 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
109a0 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
109b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  [] */.  int nByt
109c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
109d0 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d      /* Byte of m
109e0 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72  emory needed for
109f0 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
10a00 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
10a10 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
10a20 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
10a30 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
10a40 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
10a70 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
10a80 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
10a90 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10ab0 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
10ac0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
10ad0 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
10ae0 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
10af0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10b00 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
10b10 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  xed */.  KeyInfo
10b20 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20   *pKeyinfo;     
10b30 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
10b40 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
10b50 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e  index */   .  in
10b60 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
10b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
10b80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
10b90 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
10ba0 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
10bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
10bc0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
10bd0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
10be0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c00 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
10c10 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10c40 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
10c50 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
10c60 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
10c70 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
10c80 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
10c90 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
10ca0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
10cb0 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
10cc0 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
10cd0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
10ce0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10cf0 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
10d00 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43  /.  Bitmask idxC
10d10 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ols;            
10d20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c  /* Bitmap of col
10d30 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e  umns used for in
10d40 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
10d50 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20  ask extraCols;  
10d60 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
10d70 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  p of additional 
10d80 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 6f 6e  columns */.  con
10d90 73 74 20 69 6e 74 20 6d 78 43 6f 6e 73 74 72 61  st int mxConstra
10da0 69 6e 74 20 3d 20 31 30 3b 20 2f 2a 20 4d 61 78  int = 10; /* Max
10db0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10dc0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
10dd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
10de0 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
10df0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
10e00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
10e10 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
10e20 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
10e30 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
10e40 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
10e50 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
10e60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10e70 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10e80 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
10e90 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
10ea0 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
10eb0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
10ec0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
10ed0 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
10ee0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
10ef0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
10f00 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
10f10 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
10f20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
10f30 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
10f40 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
10f50 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
10f60 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
10f70 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
10f80 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 70  idxCols = 0;.  p
10f90 4c 6f 6f 70 2d 3e 61 54 65 72 6d 20 3d 20 73 71  Loop->aTerm = sq
10fa0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
10fb0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
10fc0 2d 3e 61 54 65 72 6d 2c 0a 20 20 20 20 20 20 20  ->aTerm,.       
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 6e             mxCon
10ff0 73 74 72 61 69 6e 74 2a 73 69 7a 65 6f 66 28 70  straint*sizeof(p
11000 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 30 5d 29 29  Loop->aTerm[0]))
11010 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61  ;.  if( pLoop->a
11020 54 65 72 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  Term==0 ) return
11030 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
11040 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
11050 6e 64 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 54 65  nd && pLoop->nTe
11060 72 6d 3c 6d 78 43 6f 6e 73 74 72 61 69 6e 74 3b  rm<mxConstraint;
11070 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
11080 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
11090 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
110a0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
110b0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
110c0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
110d0 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
110e0 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
110f0 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
11100 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
11110 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
11120 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
11130 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11140 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
11150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
11160 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
11170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
11180 6f 70 2d 3e 61 54 65 72 6d 5b 6e 43 6f 6c 75 6d  op->aTerm[nColum
11190 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  n++] = pTerm;.  
111a0 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
111b0 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
111c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
111d0 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b  rt( nColumn>0 );
111e0 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
111f0 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
11200 54 65 72 6d 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Term = nColumn;.
11210 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
11220 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
11230 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
11240 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
11250 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  XED.            
11260 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
11270 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 0a 20 20  _TEMP_INDEX;..  
11280 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
11290 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  ber of additiona
112a0 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
112b0 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a   to create a.  *
112c0 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  * covering index
112d0 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69  .  A "covering i
112e0 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65  ndex" is an inde
112f0 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
11300 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  all.  ** columns
11310 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64   that are needed
11320 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20   by the query.  
11330 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20  With a covering 
11340 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20  index, the.  ** 
11350 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e  original table n
11360 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
11370 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f   accessed.  Auto
11380 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75  matic indices mu
11390 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76  st.  ** be a cov
113a0 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61  ering index beca
113b0 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  use the index wi
113c0 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
113d0 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72  d if the.  ** or
113e0 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61  iginal table cha
113f0 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64  nges and the ind
11400 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e  ex and table can
11410 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64  not both be used
11420 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f  .  ** if they go
11430 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20   out of sync..  
11440 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d  */.  extraCols =
11450 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
11460 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53   (~idxCols | MAS
11470 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20  KBIT(BMS-1));.  
11480 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62  mxBitCol = (pTab
11490 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d  le->nCol >= BMS-
114a0 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61  1) ? BMS-1 : pTa
114b0 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73  ble->nCol;.  tes
114c0 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
114d0 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
114e0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
114f0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b  ->nCol==BMS-2 );
11500 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
11510 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
11520 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
11530 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e  & MASKBIT(i) ) n
11540 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  Column++;.  }.  
11550 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
11560 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
11570 31 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  1) ){.    nColum
11580 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  n += pTable->nCo
11590 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d  l - BMS + 1;.  }
115a0 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
115b0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
115c0 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
115d0 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  _ONLY;..  /* Con
115e0 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
115f0 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
11600 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
11610 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  /.  nByte = size
11620 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79  of(Index);.  nBy
11630 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
11640 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f  zeof(int);     /
11650 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
11660 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
11670 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68  Column*sizeof(ch
11680 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ar*);   /* Index
11690 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79  .azColl */.  nBy
116a0 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20  te += nColumn;  
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116c0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
116d0 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  er */.  pIdx = s
116e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
116f0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
11700 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64  Byte);.  if( pId
11710 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
11720 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
11730 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
11740 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
11750 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d  (char**)&pIdx[1]
11760 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
11770 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78  mn = (int*)&pIdx
11780 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e  ->azColl[nColumn
11790 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  ];.  pIdx->aSort
117a0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
117b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  dx->aiColumn[nCo
117c0 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a  lumn];.  pIdx->z
117d0 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
117e0 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  ex";.  pIdx->nCo
117f0 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  lumn = nColumn;.
11800 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
11810 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
11820 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
11830 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
11840 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
11850 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
11860 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
11870 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
11880 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
11890 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
118a0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
118b0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
118c0 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
118d0 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
118e0 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
118f0 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  T(iCol);.      i
11900 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
11910 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
11920 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
11930 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
11940 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
11950 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
11960 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
11970 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11980 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
11990 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
119a0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
119b0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
119c0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
119d0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
119e0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
119f0 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
11a00 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
11a10 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
11a20 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
11a30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
11a40 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
11a50 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
11a60 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
11a70 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
11a80 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
11a90 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
11aa0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
11ab0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
11ac0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
11ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11ae0 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
11af0 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
11b00 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
11b10 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
11b20 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
11b30 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
11b40 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
11b50 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
11b60 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
11b70 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  1) ){.    for(i=
11b80 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
11b90 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
11ba0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
11bb0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
11bc0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
11bd0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
11be0 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
11bf0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
11c00 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
11c10 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
11c20 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
11c30 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
11c40 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
11c50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
11c60 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
11c70 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
11c80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
11c90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11ca0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11cb0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
11cc0 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
11cd0 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
11ce0 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11d00 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
11d10 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
11d20 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
11d30 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
11d40 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
11d50 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
11d60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
11d70 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
11d80 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
11d90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11da0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
11db0 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
11dc0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
11dd0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11de0 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
11df0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
11e00 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
11e10 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
11e20 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20  egRecord, 1);.  
11e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11e40 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
11e50 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
11e60 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
11e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11e80 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
11e90 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
11ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11eb0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11ec0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
11ed0 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73   addrTop+1);.  s
11ee0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11ef0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d  P5(v, SQLITE_STM
11f00 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
11f10 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  X);.  sqlite3Vdb
11f20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11f30 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
11f40 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
11f50 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
11f60 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20  );.  .  /* Jump 
11f70 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69  here when skippi
11f80 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
11f90 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
11fa0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11fb0 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23  , addrInit);.}.#
11fc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11fd0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
11fe0 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  NDEX */..#ifndef
11ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12000 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
12010 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
12020 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  ulate an sqlite3
12030 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12040 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65  cture. It is the
12050 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
12060 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
12070 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
12080 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75  release the stru
12090 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73  cture.** by pass
120a0 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ing the pointer 
120b0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
120c0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c   function to sql
120d0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
120e0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
120f0 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63  ndex_info *alloc
12100 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20  ateIndexInfo(.  
12110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
12120 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
12130 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
12140 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
12150 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
12160 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
12170 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
12180 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
12190 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
121a0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
121b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
121c0 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
121d0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
121e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
121f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
12200 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
12210 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
12220 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
12230 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12240 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
12250 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28  .  /*WHERETRACE(
12260 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e  ("Recomputing in
12270 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e  dex info for %s.
12280 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  ..\n", pSrc->pTa
12290 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a 0a 20  b->zName));*/.. 
122a0 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
122b0 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
122c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
122d0 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
122e0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
122f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12300 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
12310 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
12320 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
12330 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
12340 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
12350 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
12360 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
12370 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
12380 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
12390 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
123a0 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
123b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
123c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
123d0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
123e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
123f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
12400 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
12410 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
12420 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
12430 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12440 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
12450 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
12460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
12470 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
12480 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
12490 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
124a0 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
124b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
124c0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
124d0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
124e0 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
124f0 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
12500 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
12510 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12520 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
12530 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
12540 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12550 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
12560 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
12570 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
12580 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
12590 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
125a0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
125b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
125c0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
125d0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
125e0 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
125f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12600 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
12610 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
12620 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
12630 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
12640 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12650 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
12660 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
12670 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
12680 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
12690 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
126c0 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
126d0 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
126e0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
12700 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
12710 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
12720 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
12730 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12750 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
12760 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
12770 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
12780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
12790 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
127a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
127b0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
127c0 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
127d0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
127e0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
127f0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
12800 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
12810 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
12820 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
12830 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
12840 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
12850 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
12860 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
12870 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
12880 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
12890 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
128a0 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
128b0 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
128c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
128d0 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
128e0 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
128f0 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
12900 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
12910 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
12920 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
12930 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
12940 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12950 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
12960 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
12970 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
12980 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
12990 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
129a0 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
129b0 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
129c0 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
129d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
129e0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
129f0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12a00 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
12a10 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
12a20 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
12a30 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
12a40 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
12a50 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
12a60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
12a70 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
12a80 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12a90 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
12af0 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
12b00 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
12b10 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
12b20 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
12b30 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
12b40 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
12b50 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
12b60 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
12b70 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
12b80 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
12b90 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
12ba0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
12bb0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
12bc0 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
12bd0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
12be0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
12bf0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
12c00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
12c10 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
12c20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
12c30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12c40 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
12c50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
12c60 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
12c70 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
12c80 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
12c90 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
12ca0 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
12cb0 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
12cc0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
12cd0 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
12ce0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
12cf0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
12d00 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
12d10 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
12d20 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
12d30 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
12d40 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
12d50 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
12d60 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
12d70 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
12d80 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
12d90 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
12da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
12db0 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
12dc0 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
12dd0 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
12de0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12df0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
12e00 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
12e10 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12e20 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
12e30 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
12e40 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12e50 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
12e60 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
12e70 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12e80 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
12e90 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
12ea0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12eb0 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
12ec0 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
12ed0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
12ee0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
12ef0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12f00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12f10 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
12f20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
12f30 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
12f40 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
12f50 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
12f60 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12f70 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12f80 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
12f90 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
12fa0 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
12fb0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
12fc0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
12fd0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
12fe0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
12ff0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
13000 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
13010 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
13020 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
13030 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
13040 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13050 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
13060 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
13070 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
13080 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
13090 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
130a0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
130b0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
130c0 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
130d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
130e0 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
130f0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
13100 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
13110 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13120 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
13130 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
13140 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
13150 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
13160 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
13170 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
13180 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
13190 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
131a0 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
131b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
131c0 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
131d0 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
131e0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
131f0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
13200 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
13210 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
13220 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
13230 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
13240 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
13250 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
13260 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
13270 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
13280 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
13290 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
132a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
132b0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
132c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
132d0 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
132e0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
132f0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
13300 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
13310 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
13320 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
13330 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
13340 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
13350 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
13360 65 29 29 3b 2a 2f 0a 20 20 54 52 41 43 45 5f 49  e));*/.  TRACE_I
13370 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
13380 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
13390 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
133a0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
133b0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
133c0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
133d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
133e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
133f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
13400 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13410 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
13420 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
13430 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
13440 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13450 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
13460 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
13470 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
13480 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13490 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
134a0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
134b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
134c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
134d0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
134e0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
134f0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
13500 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
13510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13520 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
13530 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
13540 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13550 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
13560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13570 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13580 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
13590 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
135a0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
135b0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
135c0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
135d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
135e0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
135f0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
13600 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13610 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
13620 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13630 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
13640 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
13650 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
13660 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
13670 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
13680 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
13690 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
136a0 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
136b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
136c0 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
136d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
136e0 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
136f0 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
13700 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
13710 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
13720 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
13730 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
13740 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
13750 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
13760 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
13770 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13780 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13790 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
137a0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
137b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
137c0 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
137d0 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c  main of */.  sql
137e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
137f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ,        /* Valu
13800 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  e to consider */
13810 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13830 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
13840 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
13850 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
13860 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
13870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13880 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
13890 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f  here */.){.  tRo
138a0 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53  wcnt n;.  IndexS
138b0 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a  ample *aSample;.
138c0 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a    int i, eType;.
138d0 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a    int isEq = 0;.
138e0 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c    i64 v;.  doubl
138f0 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65  e r, rS;..  asse
13900 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c  rt( roundUp==0 |
13910 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a  | roundUp==1 );.
13920 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
13930 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69  nSample>0 );.  i
13940 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74  f( pVal==0 ) ret
13950 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13960 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69  ;.  n = pIdx->ai
13970 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61  RowEst[0];.  aSa
13980 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
13990 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20  mple;.  eType = 
139a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
139b0 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  pe(pVal);..  if(
139c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
139d0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20  NTEGER ){.    v 
139e0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
139f0 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
13a00 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20   r = (i64)v;.   
13a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
13a20 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
13a30 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
13a40 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
13a50 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
13a60 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
13a70 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
13a80 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
13a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
13aa0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
13ab0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
13ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13ad0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d  aSample[i].u.i>=
13ae0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
13af0 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
13b00 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20  .u.i==v;.       
13b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13b20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13b30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13b40 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13b50 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
13b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
13b70 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
13b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
13b90 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
13ba0 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20  u.r==r;.        
13bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13bd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
13be0 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
13bf0 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69   ){.    r = sqli
13c00 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
13c10 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (pVal);.    for(
13c20 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
13c30 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
13c40 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
13c50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
13c60 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
13c70 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
13c80 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
13c90 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
13ca0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
13cb0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
13cc0 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
13cd0 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
13ce0 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20  e[i].u.r;.      
13cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
13d00 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
13d10 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
13d20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20    if( rS>=r ){. 
13d30 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53         isEq = rS
13d40 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ==r;.        bre
13d50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13d60 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
13d70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
13d80 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
13d90 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30     if( aSample[0
13da0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
13db0 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b  NULL ) isEq = 1;
13dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
13dd0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
13de0 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
13df0 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
13e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13e10 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
13e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
13e30 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
13e40 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
13e50 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13e60 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
13e70 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
13e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13e90 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
13ea0 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a  Sample ){      .
13eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
13ec0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13ed0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
13ee0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
13ef0 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
13f00 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
13f10 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
13f20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
13f30 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
13f40 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  lob(pVal);.     
13f50 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
13f60 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
13f70 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d    assert( pColl-
13f80 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
13f90 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8 );.      }else
13fa0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
13fb0 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
13fc0 53 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49  Seq(pParse, SQLI
13fd0 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64  TE_UTF8, 0, *pId
13fe0 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
13ff0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
14000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
14010 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14020 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
14030 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
14040 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75  u8 *)sqlite3Valu
14050 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c  eText(pVal, pCol
14060 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20  l->enc);.       
14070 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20   if( !z ){.     
14080 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
140a0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
140b0 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26  rt( z && pColl &
140c0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  & pColl->xCmp );
140d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
140e0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42   = sqlite3ValueB
140f0 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  ytes(pVal, pColl
14100 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20  ->enc);.  .     
14110 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e   for(; i<pIdx->n
14120 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
14130 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
14140 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65       int eSample
14150 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69  type = aSample[i
14160 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].eType;.       
14170 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
14180 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75  <eType ) continu
14190 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
141a0 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70  Sampletype!=eTyp
141b0 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64  e ) break;.#ifnd
141c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
141d0 54 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28  TF16.        if(
141e0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c   pColl->enc!=SQL
141f0 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
14200 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c        int nSampl
14210 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  e;.          cha
14220 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c  r *zSample = sql
14230 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20  ite3Utf8to16(.  
14240 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20              db, 
14250 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d  pColl->enc, aSam
14260 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d  ple[i].u.z, aSam
14270 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e  ple[i].nByte, &n
14280 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20  Sample.         
14290 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
142a0 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ( !zSample ){.  
142b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
142c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
142d0 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
142e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
142f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
14300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
14310 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
14320 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70  ll->pUser, nSamp
14330 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20  le, zSample, n, 
14340 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  z);.          sq
14350 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14360 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20  zSample);.      
14370 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
14380 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
14390 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
143a0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
143b0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
143c0 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  e, aSample[i].u.
143d0 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  z, n, z);.      
143e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
143f0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
14400 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45    if( c==0 ) isE
14410 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  q = 1;.         
14420 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14430 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14440 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
14450 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65  s point, aSample
14460 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
14470 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
14480 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a  greater than.  *
14490 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56  * or equal to pV
144a0 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49  al.  Or if i==pI
144b0 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65  dx->nSample, the
144c0 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72  n all samples ar
144d0 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  e less.  ** than
144e0 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70   pVal.  If aSamp
144f0 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65  le[i]==pVal, the
14500 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a  n isEq==1..  */.
14510 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20    if( isEq ){.  
14520 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
14530 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
14540 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
14550 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
14560 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
14570 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c  le[i].nEq;.  }el
14580 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
14590 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20  iLower, iUpper, 
145a0 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d  iGap;.    if( i=
145b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
145c0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
145d0 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30  pper = aSample[0
145e0 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ].nLt;.    }else
145f0 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
14600 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
14610 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b  e ? n : aSample[
14620 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c  i].nLt;.      iL
14630 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
14640 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c  -1].nEq + aSampl
14650 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20  e[i-1].nLt;.    
14660 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
14670 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20   pIdx->avgEq;.  
14680 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
14690 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
146a0 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
146b0 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
146c0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
146d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
146e0 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
146f0 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
14700 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
14710 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
14720 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
14730 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
14740 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74   iGap;.  }.  ret
14750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14760 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14770 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a  E_ENABLE_STAT3 *
14780 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  /../*.** If expr
14790 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70  ession pExpr rep
147a0 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61  resents a litera
147b0 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70  l value, set *pp
147c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
147d0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
147e0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
147f0 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  ining the same v
14800 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e  alue, with affin
14810 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69  ity.** aff appli
14820 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65  ed to it, before
14830 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69   returning. It i
14840 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14850 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lity of the .** 
14860 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
14870 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69  ally release thi
14880 73 20 73 74 72 75 63 74 75 72 65 20 62 79 20 70  s structure by p
14890 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a  assing it to .**
148a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
148b0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
148c0 65 20 63 75 72 72 65 6e 74 20 70 61 72 73 65 20  e current parse 
148d0 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28  is a recompile (
148e0 73 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65  sqlite3Reprepare
148f0 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a  ()) and pExpr.**
14900 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61   is an SQL varia
14910 62 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ble that current
14920 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c  ly has a non-NUL
14930 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f  L value bound to
14940 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61   it,.** create a
14950 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
14960 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
14970 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c  ning this value,
14980 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61   again with.** a
14990 66 66 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c  ffinity aff appl
149a0 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65  ied to it, inste
149b0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  ad..**.** If nei
149c0 74 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76  ther of the abov
149d0 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70  e apply, set *pp
149e0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
149f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14a00 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
14a10 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
14a20 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
14a30 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14a40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73 74  _ENABLE_STAT3.st
14a50 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72  atic int valueFr
14a60 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  omExpr(.  Parse 
14a70 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72  *pParse, .  Expr
14a80 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61   *pExpr, .  u8 a
14a90 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ff, .  sqlite3_v
14aa0 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69  alue **pp.){.  i
14ab0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
14ac0 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20  _VARIABLE.   || 
14ad0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  (pExpr->op==TK_R
14ae0 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
14af0 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42  ->op2==TK_VARIAB
14b00 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  LE).  ){.    int
14b10 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69   iVar = pExpr->i
14b20 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
14b30 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
14b40 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
14b50 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70 70 20   iVar);.    *pp 
14b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
14b70 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
14b80 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
14b90 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  aff);.    return
14ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14bb0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14bc0 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
14bd0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
14be0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66   SQLITE_UTF8, af
14bf0 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  f, pp);.}.#endif
14c00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14c10 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
14c20 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
14c30 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
14c40 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
14c50 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
14c60 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
14c70 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
14c80 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
14c90 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
14ca0 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
14cb0 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
14cc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14cd0 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
14ce0 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
14cf0 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
14d00 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
14d10 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
14d20 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
14d30 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
14d40 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
14d50 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
14d60 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
14d70 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
14d80 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
14d90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14da0 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
14db0 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
14e00 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
14e10 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
14e20 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
14e30 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
14e40 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
14e50 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
14e60 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
14e70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
14e80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20  ..**.** The nEq 
14e90 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
14ea0 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  sed the index of
14eb0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
14ec0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
14ed0 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  .** range constr
14ee0 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
14ef0 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
14f00 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
14f10 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70  onstraints.** op
14f20 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
14f30 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
14f40 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
14f50 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
14f60 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c  p is.** on t1(a,
14f70 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
14f80 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
14f90 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
14fa0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
14fb0 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
14fc0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
14fd0 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
14fe0 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28  ed the value 1 (
14ff0 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
15000 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a  tricted column,.
15010 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  ** b, is the sec
15020 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ond left-most co
15030 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
15040 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
15050 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
15060 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
15070 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
15080 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
15090 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
150a0 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20  passed 0..**.** 
150b0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
150c0 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
150d0 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75   divisor to redu
150e0 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
150f0 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65  .** search space
15100 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  .  A return valu
15110 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61  e of 1 means tha
15120 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  t range constrai
15130 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65  nts are.** no he
15140 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65  lp at all.  A re
15150 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20  turn value of 2 
15160 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73  means range cons
15170 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65  traints are.** e
15180 78 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63  xpected to reduc
15190 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
151a0 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64  ce by half.  And
151b0 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a   so forth....**.
151c0 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
151d0 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
151e0 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  3 ANALYZE data, 
151f0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
15200 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
15210 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
15220 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
15230 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e   4.  Hence a sin
15240 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  gle constraint (
15250 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20  x>?).** results 
15260 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34  in a return of 4
15270 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e   and a range con
15280 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44  straint (x>? AND
15290 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a   x<?) results.**
152a0 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
152b0 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  16..*/.static in
152c0 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
152d0 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
152e0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
152f0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
15300 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
15310 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20   */.  Index *p, 
15320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15330 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69  e index containi
15340 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  ng the range-com
15350 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78  pared column; "x
15360 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20  " */.  int nEq, 
15370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
15380 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f  ndex into p->aCo
15390 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65  l[] of the range
153a0 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
153b0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
153c0 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
153d0 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
153e0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
153f0 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
15400 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
15410 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
15420 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
15430 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
15440 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
15450 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  LL */.  double *
15460 70 52 61 6e 67 65 44 69 76 20 20 20 2f 2a 20 4f  pRangeDiv   /* O
15470 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63  UT: Reduce searc
15480 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20  h space by this 
15490 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20  divisor */.){.  
154a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
154b0 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
154c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
154d0 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
154e0 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20   p->nSample ){. 
154f0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
15500 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20 20   *pRangeVal;.   
15510 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20   tRowcnt iLower 
15520 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  = 0;.    tRowcnt
15530 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52   iUpper = p->aiR
15540 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74 52  owEst[0];.    tR
15550 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
15560 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  u8 aff = p->pTab
15570 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
15580 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
15590 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77  y;..    if( pLow
155a0 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
155b0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
155c0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
155d0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
155e0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
155f0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
15600 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20  RangeVal);.     
15610 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65 72   assert( (pLower
15620 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
15630 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
15640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15650 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
15660 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61    && whereKeySta
15670 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
15680 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d 3d  angeVal, 0, a)==
15690 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
156a0 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  ){.        iLowe
156b0 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
156c0 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e 65    if( (pLower->e
156d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54  Operator & WO_GT
156e0 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b 3d  )!=0 ) iLower +=
156f0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
15700 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
15710 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
15720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15740 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
15750 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
15760 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
15770 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
15780 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
15790 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
157a0 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
157b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
157c0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
157d0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
157e0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
157f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
15800 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
15810 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
15820 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c  p, pRangeVal, 1,
15830 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
15840 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15850 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iUpper = a[0];. 
15860 20 20 20 20 20 20 20 69 66 28 20 28 70 55 70 70         if( (pUpp
15870 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
15880 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70 70  WO_LE)!=0 ) iUpp
15890 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
158a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
158b0 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
158c0 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
158d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
158e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
158f0 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72 20 29  iUpper<=iLower )
15900 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67  {.        *pRang
15910 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70  eDiv = (double)p
15920 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
15930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15940 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
15950 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f   (double)p->aiRo
15960 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c 65 29  wEst[0]/(double)
15970 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
15980 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15990 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
159a0 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f  range scan regio
159b0 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d  ns: %u..%u  div=
159c0 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
159d0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
159e0 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
159f0 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b  r, *pRangeDiv));
15a00 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
15a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15a20 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
15a30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
15a40 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
15a50 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
15a60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15a70 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (nEq);.#endif.  
15a80 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
15a90 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70  | pUpper );.  *p
15aa0 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62  RangeDiv = (doub
15ab0 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77  le)1;.  if( pLow
15ac0 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77  er && (pLower->w
15ad0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
15ae0 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67  ULL)==0 ) *pRang
15af0 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29  eDiv *= (double)
15b00 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72 20  4;.  if( pUpper 
15b10 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20  ) *pRangeDiv *= 
15b20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65 74  (double)4;.  ret
15b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
15b40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15b50 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT3./*.** Esti
15b60 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15b70 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15b80 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
15b90 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
15ba0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15bb0 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
15bc0 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
15bd0 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
15be0 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
15bf0 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
15c00 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
15c10 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
15c20 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
15c30 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
15c40 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
15c50 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
15c60 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
15c70 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
15c80 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
15c90 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
15ca0 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
15cb0 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
15cc0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
15cd0 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
15ce0 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
15cf0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
15d00 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
15d10 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
15d20 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
15d30 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
15d40 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
15d50 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
15d60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
15d70 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
15d80 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
15d90 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
15da0 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
15db0 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
15dc0 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
15dd0 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
15de0 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
15df0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
15e00 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
15e10 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
15e20 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
15e30 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
15e40 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
15e50 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
15e60 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
15e70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15e80 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
15e90 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
15ea0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
15eb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
15ec0 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
15ed0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
15ee0 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20  mn is pTerm */. 
15ef0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
15f00 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
15f10 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
15f20 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
15f30 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75  straint */.  dou
15f40 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  ble *pnRow      
15f50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
15f60 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
15f70 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
15f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15f90 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41  pRhs = 0;  /* VA
15fa0 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  LUE on right-han
15fb0 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20  d side of pTerm 
15fc0 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  */.  u8 aff;    
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fe0 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
15ff0 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
16020 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
16030 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
16040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
16050 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61  atistics */..  a
16060 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
16070 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
16080 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
16090 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ;.  aff = p->pTa
160a0 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
160b0 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
160c0 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  ty;.  if( pExpr 
160d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75  ){.    rc = valu
160e0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
160f0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
16100 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Rhs);.    if( rc
16110 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75   ) goto whereEqu
16120 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
16130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16140 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Rhs = sqlite3Val
16150 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62  ueNew(pParse->db
16160 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68  );.  }.  if( pRh
16170 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s==0 ) return SQ
16180 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
16190 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74   rc = whereKeySt
161a0 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
161b0 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66  Rhs, 0, a);.  if
161c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
161d0 29 7b 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52  ){.    /*WHERETR
161e0 41 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73  ACE(("equality s
161f0 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
16200 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
16210 2a 2f 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  */.    *pnRow = 
16220 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45  a[1];.  }.whereE
16230 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
16240 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  el:.  sqlite3Val
16250 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20  ueFree(pRhs);.  
16260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16270 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
16280 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16290 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  T3) */..#ifdef S
162a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
162b0 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
162c0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
162d0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
162e0 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
162f0 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
16300 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
16310 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16320 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
16330 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
16340 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
16350 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
16360 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
16370 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
16380 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
16390 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
163a0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
163b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
163c0 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
163d0 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
163e0 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
163f0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
16400 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
16410 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16420 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
16430 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
16440 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
16450 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
16460 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
16470 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
16480 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
16490 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
164a0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
164b0 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
164c0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
164d0 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
164e0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
164f0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
16500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
16510 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
16520 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16530 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
16540 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
16550 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
16560 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16570 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
16580 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
16590 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
165a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
165b0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
165c0 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
165d0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
165e0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
165f0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
16600 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
16610 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
16620 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
16630 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16640 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
16650 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
16660 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
16670 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45 73 74  */.  double nEst
16680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16690 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
166a0 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
166b0 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  term */.  double
166c0 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f 75 62   nRowEst = (doub
166d0 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74  le)0; /* New est
166e0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
166f0 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
16700 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16720 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16730 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
16740 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  ample!=0 );.  fo
16750 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
16760 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d  E_OK && i<pList-
16770 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
16780 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f    nEst = p->aiRo
16790 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20  wEst[0];.    rc 
167a0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
167b0 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Est(pParse, p, p
167c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
167d0 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
167e0 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
167f0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
16800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
16810 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
16820 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
16830 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
16840 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
16850 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
16860 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
16870 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
16880 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
16890 45 73 74 29 29 3b 2a 2f 0a 20 20 7d 0a 20 20 72  Est));*/.  }.  r
168a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
168b0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
168c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
168d0 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  3) */../*.** Dis
168e0 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
168f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
16900 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
16910 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
16920 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
16930 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
16940 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
16950 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
16960 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
16970 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
16980 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
16990 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
169a0 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
169b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
169c0 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
169d0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
169e0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
169f0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
16a00 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
16a10 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
16a20 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
16a30 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
16a40 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
16a50 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
16a60 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
16a70 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
16a80 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
16a90 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
16aa0 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
16ab0 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
16ac0 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
16ad0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
16ae0 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
16af0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
16b00 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
16b10 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
16b20 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
16b30 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
16b40 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
16b50 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  abled..**.** IMP
16b60 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
16b70 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f  R-24597-58655 No
16b80 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20   tests are done 
16b90 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61  for terms that a
16ba0 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  re.** completely
16bb0 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e   satisfied by in
16bc0 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  dices..**.** Dis
16bd0 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
16be0 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
16bf0 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
16c00 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
16c10 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
16c20 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
16c30 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
16c40 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
16c50 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
16c60 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
16c70 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
16c80 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
16c90 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
16ca0 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
16cb0 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
16cc0 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
16cd0 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
16ce0 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
16cf0 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
16d00 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
16d10 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
16d20 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
16d30 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
16d40 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
16d50 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
16d60 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
16d70 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
16d80 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
16d90 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
16da0 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
16db0 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
16dc0 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
16dd0 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
16de0 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
16df0 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
16e00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
16e10 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
16e20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
16e30 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
16e40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16e50 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
16e60 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b  _FromJoin)).  ){
16e70 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
16e80 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
16e90 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
16ea0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
16eb0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
16ec0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
16ed0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
16ee0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
16ef0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
16f00 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
16f10 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
16f20 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
16f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16f40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
16f50 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
16f60 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
16f70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
16f80 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
16f90 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
16fa0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
16fb0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
16fc0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
16fd0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
16fe0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
16ff0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
17000 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
17010 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
17020 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
17030 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
17040 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
17050 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
17060 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
17070 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
17080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17090 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
170a0 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
170b0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
170c0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
170d0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
170e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
170f0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
17100 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
17110 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
17120 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
17130 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
17140 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17150 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
17160 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
17170 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17180 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
17190 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
171a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
171b0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
171c0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
171d0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
171e0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
171f0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
17200 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
17210 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
17220 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
17230 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
17240 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
17250 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
17260 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
17270 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
17280 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
17290 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
172a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
172b0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
172c0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
172d0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
172e0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
172f0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
17300 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
17310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17320 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
17330 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
17340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17350 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
17360 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
17370 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
17380 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
17390 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
173a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
173b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
173c0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
173d0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
173e0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
173f0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
17400 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
17410 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
17420 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
17430 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
17440 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
17450 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
17460 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
17470 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
17480 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
17490 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
174a0 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
174b0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
174c0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
174d0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
174e0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
174f0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
17500 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
17510 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
17520 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
17530 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
17540 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
17550 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
17560 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
17570 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
17580 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
17590 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
175a0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
175b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
175c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
175d0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
175e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
175f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
17600 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
17610 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
17620 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
17630 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
17640 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
17650 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
17660 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
17670 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
17680 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
17690 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
176a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
176b0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
176c0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
176d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
176e0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
176f0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
17700 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
17710 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
17720 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
17730 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
17740 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17750 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
17780 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
17790 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
177a0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
177b0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
177c0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
177d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
177e0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
177f0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
17800 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
17810 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
17820 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
17830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17840 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17850 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
17860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17870 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
17880 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
17890 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
178a0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
178b0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
178c0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
178d0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
178e0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
178f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
17900 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
17910 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
17920 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
17930 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
17940 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
17950 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
17960 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
17970 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
17980 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17990 61 73 65 28 20 69 45 71 3d 3d 70 4c 65 76 65 6c  ase( iEq==pLevel
179a0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 6e  ->plan.u.pIdx->n
179b0 43 6f 6c 75 6d 6e 2d 31 20 29 3b 0a 20 20 20 20  Column-1 );.    
179c0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3e    testcase( iEq>
179d0 30 20 26 26 20 69 45 71 2b 31 3c 70 4c 65 76 65  0 && iEq+1<pLeve
179e0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
179f0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
17a00 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
17a10 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
17a20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
17a30 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
17a40 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
17a50 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
17a60 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
17a70 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
17a80 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
17a90 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
17aa0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
17ab0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
17ac0 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
17ad0 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
17ae0 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20     }.    iTab = 
17af0 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
17b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b10 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
17b20 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
17b30 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61   iTab, 0);.    a
17b40 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
17b50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
17b60 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20  ULTI_OR)==0 );. 
17b70 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
17b80 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42  s |= WHERE_IN_AB
17b90 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  LE;.    if( pLev
17ba0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
17bb0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
17bc0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
17bd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17be0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
17bf0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
17c00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
17c10 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
17c20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
17c30 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
17c40 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
17c50 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17c80 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
17c90 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
17ca0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
17cb0 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
17cc0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
17cd0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
17ce0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
17cf0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
17d00 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
17d10 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
17d20 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
17d30 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
17d40 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
17d50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
17d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
17d70 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
17d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17d90 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
17da0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
17db0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
17dc0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
17dd0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
17de0 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
17df0 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
17e00 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
17e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
17e30 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
17e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
17e50 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
17e60 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
17e70 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
17e80 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
17e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
17ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
17eb0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
17ec0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
17ed0 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
17ee0 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
17ef0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  index..**.** For
17f00 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
17f10 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
17f20 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
17f30 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
17f40 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
17f50 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
17f60 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
17f70 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
17f80 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
17f90 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
17fa0 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
17fb0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17fc0 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
17fd0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
17fe0 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
17ff0 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
18000 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
18010 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
18020 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
18030 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
18040 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
18050 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
18060 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
18070 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
18080 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
18090 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
180a0 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
180b0 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
180c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
180d0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
180e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
180f0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
18100 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
18110 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
18120 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
18130 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
18140 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
18150 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
18160 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
18170 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
18180 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
18190 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
181a0 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
181b0 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
181c0 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
181d0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
181e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
181f0 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
18200 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
18210 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
18220 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
18230 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
18240 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68   memory cell. Th
18250 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
18260 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
18270 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
18280 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73  memory cell to s
18290 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
182a0 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
182b0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
182c0 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
182d0 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
182e0 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
182f0 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
18300 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
18310 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
18320 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
18330 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
18340 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
18350 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
18360 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
18370 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
18380 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
18390 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
183a0 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
183b0 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
183c0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
183d0 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
183e0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
183f0 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
18400 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
18410 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
18420 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
18430 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
18440 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
18450 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
18460 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
18470 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
18480 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
18490 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
184a0 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
184b0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
184c0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
184d0 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
184e0 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
184f0 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
18500 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
18510 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
18520 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
18530 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
18540 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
18550 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
18560 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
18570 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
18580 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
18590 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
185a0 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
185b0 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
185c0 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
185d0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
185e0 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
185f0 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
18600 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
18610 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
18620 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
18630 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
18640 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
18650 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
18660 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
18670 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
18680 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18690 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
186a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
186b0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
186c0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
186d0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
186e0 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
186f0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
18700 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
18710 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
18720 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
18730 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
18740 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
18750 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
18760 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
18770 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
18780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18790 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
187a0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
187b0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
187c0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
187d0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
187e0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
187f0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
18800 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
18810 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
18820 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
18830 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
18840 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18860 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
18870 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
18880 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
18890 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
188a0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
188b0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
188c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
188d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
188f0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
18900 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
18910 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
18920 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
18930 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
18940 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
18950 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
18960 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
18970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
18980 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
18990 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
189c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
189d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
189e0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
189f0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
18a00 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
18a10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18a20 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
18a30 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
18a40 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a60 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
18a70 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
18a80 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
18a90 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
18aa0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
18ab0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
18ac0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
18ad0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
18ae0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
18af0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18b00 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
18b10 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
18b20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
18b30 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
18b40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
18b50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
18b60 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
18b70 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
18b80 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
18b90 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
18ba0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
18bb0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
18bc0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
18bd0 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
18be0 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
18bf0 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
18c00 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
18c10 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
18c20 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
18c30 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
18c40 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
18c50 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
18c60 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
18c70 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
18c80 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
18c90 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
18ca0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
18cb0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
18cc0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
18cd0 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
18ce0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
18cf0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
18d00 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
18d10 70 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  p->aTerm[j];.   
18d20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
18d30 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
18d40 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66  following true f
18d50 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
18d60 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
18d70 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
18d80 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
18d90 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
18da0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
18db0 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
18dc0 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
18dd0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
18de0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
18df0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
18e00 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
18e10 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
18e20 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
18e30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
18e40 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
18e50 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
18e60 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
18e70 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a   bRev, regBase+j
18e80 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
18e90 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
18ea0 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
18eb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18ec0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18ed0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
18ee0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
18ef0 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
18f00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
18f10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18f20 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
18f30 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
18f40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
18f50 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
18f60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
18f70 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
18f80 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
18f90 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
18fa0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
18fb0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
18fc0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
18fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
18fe0 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
18ff0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
19000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19010 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
19020 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
19030 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61  ase+j, pLevel->a
19040 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69  ddrBrk);.      i
19050 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20  f( zAff ){.     
19060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
19070 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
19080 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
19090 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
190a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
190b0 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
190c0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
190d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
190e0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
190f0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
19100 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20  Right, zAff[j]) 
19110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
19120 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
19130 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
19140 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
19150 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a    }.  *pzAff = z
19160 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Aff;.  return re
19170 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  gBase;.}..#ifnde
19180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
19190 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PLAIN./*.** This
191a0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
191b0 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
191c0 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
191d0 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
191e0 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
191f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
19200 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
19210 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
19220 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
19230 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
19240 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
19250 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
19260 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
19270 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
19280 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
19290 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
192a0 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
192b0 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
192c0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
192d0 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
192e0 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
192f0 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
19300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
19310 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
19320 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e  ng built */.  in
19330 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t iTerm,        
19340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19350 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e  ex of this term.
19360 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20    First is zero 
19370 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
19380 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  *zColumn,       
19390 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
193a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
193b0 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20  t char *zOp     
193c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
193d0 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
193e0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72  */.){.  if( iTer
193f0 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  m ) sqlite3StrAc
19400 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
19410 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73  " AND ", 5);.  s
19420 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
19430 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75  pend(pStr, zColu
19440 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  mn, -1);.  sqlit
19450 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
19460 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a  (pStr, zOp, 1);.
19470 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
19480 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f  mAppend(pStr, "?
19490 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
194a0 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20  Argument pLevel 
194b0 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61  describes a stra
194c0 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e  tegy for scannin
194d0 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68  g table pTab. Th
194e0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
194f0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
19500 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  r to a string bu
19510 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
19520 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a  a description.**
19530 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f   of the subset o
19540 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61  f table rows sca
19550 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61  nned by the stra
19560 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d  tegy in the form
19570 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78   of an.** SQL ex
19580 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66  pression. Or, if
19590 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63   all rows are sc
195a0 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  anned, NULL is r
195b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  eturned..**.** F
195c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
195d0 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
195e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
195f0 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44  t1 WHERE a=1 AND
19600 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72   b>2;.**.** is r
19610 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  un and there is 
19620 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
19630 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  b), then this fu
19640 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
19650 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c  .** string simil
19660 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ar to:.**.**   "
19670 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a  a=? AND b>?".**.
19680 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
19690 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
196a0 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
196b0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
196c0 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  Malloc()..** It 
196d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
196e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
196f0 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20  ler to free the 
19700 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69  buffer when it i
19710 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  s.** no longer r
19720 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
19730 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  ic char *explain
19740 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74  IndexRange(sqlit
19750 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
19760 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20  p *pLoop, Table 
19770 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
19780 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  *pIndex = pLoop-
19790 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
197a0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
197b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
197c0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
197d0 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
197e0 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20  ab->aCol;.  int 
197f0 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
19800 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
19810 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
19820 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
19830 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19840 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f   nEq==0 && (pLoo
19850 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
19860 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
19870 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d  ERE_TOP_LIMIT))=
19880 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19890 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
198a0 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74  3StrAccumInit(&t
198b0 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  xt, 0, 0, SQLITE
198c0 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
198d0 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73  txt.db = db;.  s
198e0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
198f0 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c  pend(&txt, " (",
19900 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   2);.  for(i=0; 
19910 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nEq; i++){.   
19920 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
19930 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c  rm(&txt, i, aCol
19940 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
19950 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a  ame, "=");.  }..
19960 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
19970 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
19980 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
19990 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
199a0 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
199b0 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
199c0 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
199d0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
199e0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
199f0 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
19a00 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
19a10 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
19a20 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
19a30 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
19a40 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
19a50 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
19a60 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
19a70 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
19a80 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
19a90 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b  txt, i, z, "<");
19aa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
19ab0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
19ac0 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
19ad0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
19ae0 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
19af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19b10 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
19b20 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
19b30 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
19b40 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
19b50 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
19b60 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
19b70 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
19b80 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
19b90 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
19ba0 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
19bb0 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
19bc0 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
19bd0 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
19be0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
19bf0 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
19c00 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
19c10 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
19c20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
19c30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
19c40 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
19c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19c60 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
19c70 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
19c80 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
19c90 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
19ca0 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
19cb0 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
19cc0 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
19cd0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19cf0 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
19d00 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
19d10 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
19d20 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
19d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
19d40 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
19d50 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
19d60 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
19d70 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
19d80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
19d90 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
19da0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
19db0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
19dc0 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
19dd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19de0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
19df0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
19e00 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
19e10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
19e20 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
19e30 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
19e40 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
19e50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
19e60 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
19e70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
19e80 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
19eb0 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
19ec0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
19ed0 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  t64 nRow;       
19ee0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
19ef0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
19f00 69 73 69 74 65 64 20 62 79 20 73 63 61 6e 20 2a  isited by scan *
19f10 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  /.    int iId = 
19f20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
19f30 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64  d;  /* Select id
19f40 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70   (left-most outp
19f50 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20  ut column) */.  
19f60 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20    int isSearch; 
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45  /* True for a SE
19f90 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20  ARCH. False for 
19fa0 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65  SCAN. */.    Whe
19fb0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
19fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19fd0 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68  e controlling Wh
19fe0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
19ff0 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b  /.    u32 flags;
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61      /* Flags tha
1a020 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  t describe this 
1a030 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  loop */..    pLo
1a040 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1a050 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1a060 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1a070 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1a080 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1a090 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1a0a0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1a0b0 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
1a0c0 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
1a0d0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1a0e0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1a0f0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
1a100 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1a110 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
1a120 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
1a130 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
1a140 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1a150 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
1a160 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1a170 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1a180 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
1a190 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1a1a0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
1a1b0 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
1a1c0 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
1a1d0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1a1e0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1a1f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1a200 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
1a210 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
1a220 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
1a230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a240 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1a250 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1a260 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
1a270 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1a280 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
1a290 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1a2a0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
1a2b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1a2c0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1a2d0 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
1a2e0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1a2f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1a300 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
1a310 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c  PK|WHERE_VIRTUAL
1a320 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20  TABLE))==0.     
1a330 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
1a340 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
1a350 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1a360 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49  Where = explainI
1a370 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c  ndexRange(db, pL
1a380 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  oop, pItem->pTab
1a390 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  );.      zMsg = 
1a3a0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1a3b0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
1a3c0 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25 73 25  ING %s%sINDEX%s%
1a3d0 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20  s%s", zMsg, .   
1a3e0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
1a3f0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
1a400 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a  X)?"AUTOMATIC ":
1a410 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
1a420 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
1a430 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49  DX_ONLY)?"COVERI
1a440 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  NG ":""),.      
1a450 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
1a460 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
1a470 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20  "":" "),.       
1a480 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
1a490 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22  RE_TEMP_INDEX)?"
1a4a0 22 3a 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ": pLoop->u.btre
1a4b0 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
1a4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65  ,.          zWhe
1a4d0 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
1a4e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a4f0 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
1a500 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1a510 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1a520 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  0 && (flags & WH
1a530 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
1a540 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1a550 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1a560 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1a570 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
1a580 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
1a590 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
1a5a0 6c 61 67 73 26 57 48 45 52 45 5f 43 4f 4c 55 4d  lags&WHERE_COLUM
1a5b0 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  N_EQ ){.        
1a5c0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1a5d0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1a5e0 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
1a5f0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1a600 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
1a610 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
1a620 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
1a630 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1a640 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1a650 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1a660 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
1a670 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1a680 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a690 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
1a6a0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1a6b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1a6c0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1a6d0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1a6e0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1a6f0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a700 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
1a710 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1a720 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1a730 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1a740 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
1a750 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1a760 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1a770 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a780 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
1a790 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
1a7a0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1a7b0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1a7c0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1a7d0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1a7e0 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1a7f0 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1a820 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
1a830 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1a840 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a850 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28  if( wctrlFlags&(
1a860 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1a870 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1a880 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65  MAX) ){.      te
1a890 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1a8a0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
1a8b0 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20  BY_MIN );.      
1a8c0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65  nRow = 1;.    }e
1a8d0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  lse{.      nRow 
1a8e0 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1a8f0 29 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  )pLoop->nOut;.  
1a900 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
1a910 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1a920 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
1a930 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
1a940 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
1a950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a960 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
1a970 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
1a980 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
1a990 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
1a9a0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
1a9b0 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
1a9c0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
1a9d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1a9e0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
1a9f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1aa00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1aa10 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
1aa20 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1aa30 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
1aa40 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
1aa50 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
1aa60 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
1aa70 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
1aa80 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1aa90 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
1aaa0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
1aab0 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
1aac0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1aad0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1aae0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
1aaf0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
1ab00 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
1ab10 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1ab20 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
1ab30 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
1ab40 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
1ab50 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
1ab60 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1ab70 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
1ab80 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
1ab90 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
1aba0 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
1abb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1abc0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1abd0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1abe0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1abf0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1ac00 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
1ac10 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
1ac20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
1ac30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1ac40 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
1ac50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
1ac60 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
1ac70 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
1ac80 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
1ac90 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
1aca0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1acb0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
1acc0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1acd0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
1ace0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
1acf0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
1ad00 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1ad10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1ad20 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
1ad30 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
1ad40 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1ad50 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1ad60 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
1ad70 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
1ad80 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
1ad90 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1ada0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1adb0 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
1adc0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1add0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1ae00 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  text */.  Vdbe *
1ae10 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1ae20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ae30 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
1ae40 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1ae50 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
1ae60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1ae70 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
1ae80 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
1ae90 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1aea0 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aec0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
1aed0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
1aee0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
1aef0 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
1af00 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1af10 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
1af20 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
1af30 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
1af40 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1af50 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
1af60 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
1af70 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
1af80 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
1af90 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
1afa0 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
1afb0 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
1afc0 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42  returning */.  B
1afd0 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61  itmask newNotRea
1afe0 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  dy;      /* Retu
1aff0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70  rn value */..  p
1b000 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1b010 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
1b020 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
1b030 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43  WC = pWInfo->pWC
1b040 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
1b050 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
1b060 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1b070 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1b080 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1b090 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1b0a0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1b0b0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1b0c0 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
1b0d0 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
1b0e0 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
1b0f0 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
1b100 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b110 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
1b120 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
1b130 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
1b140 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
1b150 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  )==0;.  VdbeNoop
1b160 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
1b170 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22  in Join Loop %d"
1b180 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f  , iLevel));..  /
1b190 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
1b1a0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
1b1b0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
1b1c0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
1b1d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1b1e0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
1b1f0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
1b200 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
1b210 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
1b220 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
1b230 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
1b240 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
1b250 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
1b260 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
1b270 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
1b280 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
1b290 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
1b2a0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
1b2b0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
1b2c0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1b2d0 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
1b2e0 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
1b2f0 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
1b300 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
1b310 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
1b320 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
1b330 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1b340 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
1b350 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
1b360 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
1b370 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b380 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1b390 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
1b3a0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
1b3b0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
1b3c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b3d0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
1b3e0 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
1b3f0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1b400 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
1b410 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
1b420 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
1b430 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
1b440 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
1b450 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
1b460 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
1b470 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
1b480 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
1b490 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
1b4a0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
1b4b0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
1b4c0 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
1b4d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1b4e0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
1b4f0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1b500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b510 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
1b520 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
1b530 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1b540 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
1b550 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
1b560 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g"));.  }..  /* 
1b570 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  Special case of 
1b580 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75  a FROM clause su
1b590 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74  bquery implement
1b5a0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
1b5b0 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ne */.  if( pTab
1b5c0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
1b5d0 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
1b5e0 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
1b5f0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
1b600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b610 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1b620 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  r, pTabItem->add
1b630 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59  rFillSub-1, regY
1b640 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65  ield);.    pLeve
1b650 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
1b660 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1b670 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
1b680 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1b690 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
1b6a0 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25   of co-routine %
1b6b0 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  s", pTabItem->pT
1b6c0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
1b6d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b6e0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
1b6f0 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b  Yield+1, addrBrk
1b700 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1b710 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1b720 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1b730 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1b740 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1b750 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1b760 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1b770 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1b780 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1b790 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1b7a0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1b7b0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1b7c0 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1b7d0 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1b7e0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1b7f0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1b800 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1b810 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1b820 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1b830 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1b840 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1b850 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
1b860 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b870 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1b880 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1b890 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1b8a0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1b8b0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1b8c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1b8d0 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
1b8e0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
1b8f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b900 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
1b910 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
1b920 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a  = pLoop->aTerm[j
1b930 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1b940 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b950 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1b960 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1b970 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1b980 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1b990 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1b9a0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1b9b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1b9c0 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
1b9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b9e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b9f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1ba00 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1ba10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ba20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ba30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1ba40 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
1ba50 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
1ba60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ba70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1ba80 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
1ba90 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
1baa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bab0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1bac0 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1bad0 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1bb00 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1bb20 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1bb30 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1bb40 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1bb50 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1bb60 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1bb70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1bb80 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1bb90 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1bba0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1bbb0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1bbd0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1bbe0 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d 29  pLoop->aTerm[j])
1bbf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bc00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1bc10 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1bc20 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1bc30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1bc40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1bc50 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1bc60 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bc70 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1bc80 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1bc90 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1bca0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1bcb0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
1bcc0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1bcd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1bce0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1bcf0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1bd00 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1bd10 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
1bd20 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1bd30 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1bd40 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
1bd50 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1bd60 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
1bd70 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
1bd80 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
1bd90 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
1bda0 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
1bdb0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1bdc0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1bdd0 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
1bde0 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
1bdf0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1be00 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
1be10 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
1be20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
1be30 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
1be40 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1be50 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
1be60 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
1be70 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1be80 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1be90 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1bea0 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  aTerm[0];.    as
1beb0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1bec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1bed0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
1bee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
1bef0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
1bf00 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1bf10 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1bf20 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
1bf30 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
1bf40 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65   */.    iRowidRe
1bf50 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1bf60 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1bf70 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1bf80 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1bf90 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
1bfa0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1bfb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bfc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
1bfd0 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
1bfe0 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
1bff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c000 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1c010 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1c020 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1c030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c040 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1c050 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69  ge(pParse, iRowi
1c060 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71  dReg, 1);.    sq
1c070 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1c080 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1c090 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1c0a0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1c0b0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1c0c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1c0d0 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
1c0e0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1c0f0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1c100 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
1c110 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c120 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
1c130 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  ANGE)!=0.  ){.  
1c140 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65    /* Case 3:  We
1c150 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
1c160 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1c170 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1c180 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
1c190 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
1c1a0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
1c1b0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
1c1c0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
1c1d0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c1e0 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
1c1f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1c200 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1c210 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  j = 0;.    pStar
1c220 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20  t = pEnd = 0;.  
1c230 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1c240 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1c250 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20  _LIMIT ) pStart 
1c260 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a  = pLoop->aTerm[j
1c270 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1c280 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1c290 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1c2a0 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54  pEnd = pLoop->aT
1c2b0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1c2c0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1c2d0 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1c2e0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1c2f0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1c300 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1c310 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1c320 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c340 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1c350 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1c360 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1c370 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1c380 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1c390 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1c3a0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1c3b0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1c3c0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c3d0 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1c3e0 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1c3f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1c400 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1c410 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1c420 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1c430 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1c440 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1c450 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1c460 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1c470 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1c480 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
1c490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1c4a0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
1c4b0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1c4c0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1c4d0 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
1c4e0 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1c4f0 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
1c500 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1c510 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1c520 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1c530 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1c540 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1c550 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1c560 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1c570 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1c580 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1c590 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1c5a0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1c5b0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1c5c0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ct. */..      te
1c5d0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1c5e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1c5f0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
1c600 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
1c610 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  /.      pX = pSt
1c620 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1c630 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1c640 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c650 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1c660 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
1c670 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1c680 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1c690 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1c6a0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1c6b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c6c0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1c6d0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1c6e0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1c6f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1c700 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1c710 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1c720 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1c730 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1c740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1c750 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1c760 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1c770 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1c780 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1c790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c7a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c7b0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1c7c0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1c7d0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1c7e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c7f0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
1c800 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
1c810 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
1c820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c830 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1c840 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
1c850 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1c860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c870 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1c880 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1c890 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1c8a0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65  1662 */.      me
1c8b0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1c8c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1c8d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c8e0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1c8f0 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1c900 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1c910 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1c920 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1c930 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1c940 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1c950 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1c960 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1c970 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1c980 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1c990 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1c9a0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1c9b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1c9c0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1c9d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1c9e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1c9f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1ca00 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1ca10 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1ca20 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1ca30 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69  2 = start;.    i
1ca40 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20  f( pStart==0 && 
1ca50 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pEnd==0 ){.     
1ca60 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
1ca70 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
1ca80 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
1ca90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1caa0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1cab0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
1cac0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1cad0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1cae0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1caf0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1cb00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1cb10 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1cb20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cb30 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1cb40 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1cb50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cb60 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1cb70 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1cb80 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1cb90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1cba0 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1cbb0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1cbc0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1cbd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cbe0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1cbf0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1cc00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1cc10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1cc20 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cc30 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1cc40 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1cc50 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1cc60 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1cc70 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1cc80 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1cc90 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1cca0 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1ccb0 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1ccc0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1ccd0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1cce0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1ccf0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1cd00 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1cd10 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1cd20 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1cd30 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1cd40 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1cd50 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1cd60 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1cd70 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1cd80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1cd90 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1cda0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1cdb0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1cdc0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1cdd0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1cde0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1cdf0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1ce00 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1ce10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ce20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1ce30 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1ce40 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1ce50 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1ce60 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1ce70 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1ce80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1ce90 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1cea0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1ceb0 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1cec0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ced0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1cee0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1cef0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1cf00 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1cf10 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1cf20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1cf30 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1cf50 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1cf60 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1cf70 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1cf80 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1cf90 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1cfa0 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1cfb0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1cfc0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1cfd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1cfe0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1cff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d000 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1d010 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1d020 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1d030 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1d040 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1d050 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1d060 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1d070 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1d080 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1d090 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1d0a0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1d0b0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1d0c0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1d0d0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1d0e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1d0f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1d100 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1d110 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1d120 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1d130 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1d140 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1d150 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1d160 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1d170 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1d180 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1d190 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1d1a0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1d1b0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1d1c0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1d1d0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1d1e0 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1d1f0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1d200 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1d210 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1d220 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1d230 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1d240 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1d250 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1d260 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1d270 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1d280 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1d290 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1d2a0 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1d2b0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1d2c0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1d2d0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1d2e0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1d2f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1d300 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1d310 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1d320 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1d330 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1d340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1d350 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1d360 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1d370 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1d380 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1d390 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1d3a0 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1d3b0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1d3c0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1d3d0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1d3e0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1d3f0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1d400 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1d410 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1d420 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1d430 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1d440 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1d450 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1d460 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
1d470 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1d480 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1d490 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a  == or IN terms *
1d4a0 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  /.    int isMinQ
1d4b0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
1d4c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1d4d0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1d4e0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
1d4f0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1d500 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1d510 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1d520 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1d530 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1d540 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20  /.    int r1;   
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1d570 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ter */.    Where
1d580 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
1d590 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
1d5a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1d5b0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
1d5c0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1d5d0 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
1d5e0 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
1d5f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1d600 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
1d610 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d630 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
1d640 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
1d650 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1d660 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
1d670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d680 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
1d690 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1d6a0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
1d6b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
1d6c0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1d6d0 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
1d6e0 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
1d6f0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1d700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d710 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1d720 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
1d730 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d750 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1d760 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1d770 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d790 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1d7a0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
1d7b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
1d7c0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
1d7d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d7e0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1d7f0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1d800 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1d810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d820 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
1d830 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1d840 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
1d850 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1d860 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
1d870 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1d880 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  */.    char *zEn
1d890 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dAff;           
1d8a0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1d8b0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
1d8c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a   constraint */..
1d8d0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
1d8e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1d8f0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1d900 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1d910 0a 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70  .    k = (nEq==p
1d920 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d  Idx->nColumn ? -
1d930 31 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  1 : pIdx->aiColu
1d940 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f  mn[nEq]);..    /
1d950 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
1d960 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
1d970 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
1d980 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
1d990 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
1d9a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1d9b0 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
1d9c0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
1d9d0 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
1d9e0 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
1d9f0 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
1da00 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
1da10 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
1da20 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
1da30 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
1da40 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
1da50 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
1da60 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1da70 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
1da80 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
1da90 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
1daa0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
1dab0 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
1dac0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1dad0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
1dae0 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
1daf0 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
1db00 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
1db10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1db20 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1db30 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
1db40 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
1db50 2d 3e 6e 4f 42 53 61 74 3e 30 29 0a 20 20 20 20  ->nOBSat>0).    
1db60 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   && (pIdx->nColu
1db70 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  mn>nEq).    ){. 
1db80 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
1db90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1dba0 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  =1 ); */.      /
1dbb0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
1dbc0 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
1dbd0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
1dbe0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20  iColumn[nEq] ); 
1dbf0 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75  */.      isMinQu
1dc00 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ery = 1;.      n
1dc10 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1dc20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
1dc30 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
1dc40 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1dc50 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
1dc60 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
1dc70 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
1dc80 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71    */.    j = nEq
1dc90 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1dca0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1dcb0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1dcc0 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
1dcd0 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a  = pLoop->aTerm[j
1dce0 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1dcf0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1dd00 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1dd10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1dd20 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1dd30 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1dd40 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b 2b 5d 3b  oop->aTerm[j++];
1dd50 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1dd60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1dd70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1dd80 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
1dd90 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
1dda0 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
1ddb0 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
1ddc0 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
1ddd0 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
1dde0 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
1ddf0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
1de00 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
1de10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
1de20 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
1de30 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
1de40 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
1de50 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
1de60 64 79 2c 20 62 52 65 76 2c 20 6e 45 78 74 72 61  dy, bRev, nExtra
1de70 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a  Reg, &zStartAff.
1de80 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41      );.    zEndA
1de90 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
1dea0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1deb0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
1dec0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1ded0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1dee0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1def0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1df00 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1df10 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1df20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1df30 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1df40 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1df50 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1df60 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1df70 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1df80 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1df90 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1dfa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1dfb0 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
1dfc0 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1dfd0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1dfe0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1dff0 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1e000 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  && pIdx->nColumn
1e010 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1e020 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1e030 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1e040 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1e050 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
1e060 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1e070 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
1e080 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1e090 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1e0a0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1e0b0 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
1e0c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
1e0d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1e0e0 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
1e0f0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1e100 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
1e110 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1e120 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
1e130 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1e140 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74   WO_GE );.    st
1e150 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1e160 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1e170 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1e180 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1e190 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1e1a0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1e1b0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1e1c0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1e1d0 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1e1e0 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1e1f0 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1e200 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1e210 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1e220 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1e230 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1e240 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1e250 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1e260 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1e270 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1e280 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1e290 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1e2a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e2b0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1e2c0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1e2d0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1e2e0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1e2f0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1e300 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e310 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1e320 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1e330 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1e340 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
1e350 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
1e360 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1e370 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1e380 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1e390 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1e3a0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1e3b0 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
1e3c0 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
1e3d0 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
1e3e0 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
1e3f0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
1e400 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
1e410 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
1e420 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
1e430 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
1e440 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
1e450 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
1e460 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
1e470 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
1e480 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
1e490 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1e4a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1e4b0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1e4c0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1e4d0 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
1e4e0 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
1e4f0 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
1e500 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1e510 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1e520 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
1e530 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1e540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e550 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
1e560 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1e570 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
1e580 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
1e590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
1e5a0 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
1e5b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e5c0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e5d0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1e5e0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1e5f0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
1e600 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
1e610 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1e620 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
1e630 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1e640 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1e650 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a  , nConstraint, z
1e660 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
1e670 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
1e680 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
1e690 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
1e6a0 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
1e6b0 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
1e6c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1e6d0 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
1e6e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e6f0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
1e700 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e710 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
1e720 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e730 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
1e740 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1e750 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
1e760 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1e770 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
1e780 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1e790 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1e7a0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1e7b0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1e7c0 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
1e7d0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
1e7e0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1e7f0 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
1e800 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
1e810 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
1e820 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
1e830 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1e840 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
1e850 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1e860 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
1e870 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
1e880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e890 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1e8a0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
1e8b0 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
1e8c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e8d0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1e8e0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1e8f0 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
1e900 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1e910 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
1e920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e930 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
1e940 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
1e950 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
1e960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e970 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
1e980 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e990 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1e9a0 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  y(pRight, zEndAf
1e9b0 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
1e9c0 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
1e9d0 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
1e9e0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1e9f0 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1ea00 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
1ea10 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
1ea20 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
1ea30 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
1ea40 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
1ea50 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
1ea60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
1ea70 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
1ea80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
1ea90 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
1eaa0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1eab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eac0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
1ead0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1eae0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e  ange(pRight, zEn
1eaf0 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  dAff[nEq]) ){.  
1eb00 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
1eb10 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1eb20 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1eb30 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1eb40 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1eb50 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1eb60 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64  ase, nEq+1, zEnd
1eb70 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
1eb80 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
1eb90 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1eba0 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
1ebb0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1ebc0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1ebd0 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1662 */.    }.  
1ebe0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ebf0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61  pParse->db, zSta
1ec00 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
1ec10 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1ec20 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  ->db, zEndAff);.
1ec30 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
1ec40 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
1ec50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1ec60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1ec70 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
1ec80 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
1ec90 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
1eca0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
1ecb0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
1ecc0 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28     op = aEndOp[(
1ecd0 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71  pRangeEnd || nEq
1ece0 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b  ) * (1 + bRev)];
1ecf0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1ed00 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20  p==OP_Noop );.  
1ed10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ed20 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
1ed30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1ed40 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66  _IdxLT );.    if
1ed50 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ( op!=OP_Noop ){
1ed60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ed70 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
1ed80 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
1ed90 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
1eda0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
1edb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1edc0 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d  ngeP5(v, endEq!=
1edd0 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20  bRev ?1:0);.    
1ede0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1edf0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1ee00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63  y constraints, c
1ee10 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
1ee20 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  lue.    ** of th
1ee30 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74  e table column t
1ee40 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69  hat the inequali
1ee50 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20  ty contrains is 
1ee60 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
1ee70 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
1ee80 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
1ee90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
1eea0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31  p..    */.    r1
1eeb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1eec0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1eed0 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
1eee0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1eef0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1ef00 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
1ef10 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
1ef20 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1ef30 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _TOP_LIMIT );.  
1ef40 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1ef50 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
1ef60 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1ef70 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
1ef80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ef90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1efa0 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1efb0 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
1efc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1efd0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1efe0 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
1eff0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f000 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f010 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
1f020 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1f030 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1f040 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1f050 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1f060 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1f070 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1f080 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1f090 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
1f0a0 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
1f0b0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1f0c0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1f0d0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1f0e0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1f0f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f100 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
1f110 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
1f120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f130 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1f140 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1f150 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1f160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f170 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
1f180 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1f190 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
1f1a0 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
1f1b0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1f1c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
1f1d0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1f1e0 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
1f1f0 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
1f200 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
1f210 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
1f220 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
1f230 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1f240 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1f250 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20   & WHERE_ONEROW 
1f260 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1f270 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
1f280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
1f290 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  v ){.      pLeve
1f2a0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
1f2b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f2c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1f2d0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  P_Next;.    }.  
1f2e0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1f2f0 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20  IdxCur;.    if( 
1f300 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1f310 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1f320 45 51 20 7c 20 57 48 45 52 45 5f 43 4f 4c 55 4d  EQ | WHERE_COLUM
1f330 4e 5f 52 41 4e 47 45 20 7c 20 0a 20 20 20 20 20  N_RANGE | .     
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f350 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d       WHERE_COLUM
1f360 4e 5f 4e 55 4c 4c 20 7c 20 57 48 45 52 45 5f 43  N_NULL | WHERE_C
1f370 4f 4c 55 4d 4e 5f 49 4e 29 29 3d 3d 30 20 29 7b  OLUMN_IN))==0 ){
1f380 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1f390 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
1f3a0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
1f3b0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
1f3c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1f3d0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1f3e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
1f3f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f400 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1f410 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
1f420 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
1f430 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
1f440 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
1f450 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
1f460 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
1f470 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
1f480 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1f490 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f4a0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
1f4b0 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
1f4c0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1f4d0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1f4e0 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
1f4f0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
1f500 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
1f510 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
1f520 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
1f530 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1f540 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1f550 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
1f560 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
1f570 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
1f580 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
1f590 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
1f5a0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1f5b0 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
1f5c0 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
1f5d0 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
1f5e0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1f5f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1f600 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1f610 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1f620 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1f630 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
1f640 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
1f650 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
1f660 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
1f670 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
1f680 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
1f690 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
1f6a0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1f6b0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
1f6c0 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
1f6d0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
1f6e0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
1f6f0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
1f700 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
1f710 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
1f720 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
1f730 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
1f740 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
1f750 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
1f760 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
1f770 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1f780 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
1f790 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
1f7a0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1f7b0 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
1f7c0 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
1f7d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f7e0 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
1f7f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1f800 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
1f810 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
1f820 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
1f830 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
1f840 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
1f850 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
1f860 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
1f870 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
1f880 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
1f890 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
1f8a0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
1f8b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f8c0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1f8e0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1f8f0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1f900 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
1f910 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
1f920 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
1f930 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
1f940 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f950 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
1f980 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
1f990 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f9a0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
1f9c0 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1f9d0 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
1f9e0 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
1f9f0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
1fa00 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
1fa10 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
1fa20 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
1fa30 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
1fa40 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
1fa50 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
1fa60 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
1fa70 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
1fa80 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
1fa90 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
1faa0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
1fab0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
1fac0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
1fad0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
1fae0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
1faf0 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
1fb00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
1fb10 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
1fb20 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
1fb30 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
1fb40 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
1fb50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
1fb60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1fb70 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
1fb80 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
1fb90 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
1fba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1fbc0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
1fbd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
1fbe0 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1fc10 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
1fc20 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
1fc30 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
1fc40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fc50 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
1fc60 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
1fc70 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1fca0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
1fcb0 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
1fcc0 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
1fcd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1fce0 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
1fcf0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
1fd00 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
1fd10 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1fd40 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
1fd50 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
1fd60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
1fd70 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
1fd80 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
1fd90 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1fda0 70 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  p->aTerm[0];.   
1fdb0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1fdc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1fdd0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1fde0 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  r & WO_OR );.   
1fdf0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
1fe00 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1fe10 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
1fe20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
1fe30 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1fe40 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1fe50 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
1fe60 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
1fe70 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
1fe80 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
1fe90 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20  cList in pOrTab 
1fea0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1feb0 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
1fec0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1fed0 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
1fee0 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
1fef0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
1ff00 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
1ff10 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
1ff20 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
1ff30 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
1ff40 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
1ff50 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
1ff60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
1ff70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
1ff80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
1ff90 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
1ffa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1ffb0 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
1ffc0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
1ffd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ffe0 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
1fff0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
20000 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
20010 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
20020 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
20030 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
20040 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
20050 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
20060 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Raw(pParse->db,.
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
20090 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
200a0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
200b0 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
200c0 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
200d0 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
200e0 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
200f0 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36  b->nAlloc = (i16
20100 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
20110 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
20120 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
20130 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
20140 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
20150 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
20160 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
20170 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
20180 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
20190 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
201a0 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
201b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
201c0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
201d0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
201e0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
201f0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
20200 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
20210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
20220 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
20230 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
20240 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20250 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
20260 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
20270 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
20280 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
20290 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
202a0 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
202b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
202c0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
202d0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
202e0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
202f0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
20300 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
20310 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
20320 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
20330 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
20340 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
20350 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
20360 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
20370 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
20380 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
20390 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
203a0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
203b0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
203c0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
203d0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
203e0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
203f0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
20400 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
20410 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
20420 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
20430 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
20440 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
20450 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
20460 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
20470 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
20480 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
20490 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
204a0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
204b0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
204c0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
204d0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
204e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
204f0 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
20500 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20520 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
20530 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
20540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
20550 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
20560 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20570 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
20580 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
20590 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
205a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
205b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
205c0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
205d0 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
205e0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
205f0 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
20600 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
20610 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
20620 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
20630 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
20640 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
20650 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
20660 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
20670 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
20680 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
20690 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
206a0 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
206b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
206c0 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
206d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
206e0 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
206f0 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
20700 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
20710 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
20720 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
20730 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
20740 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
20750 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
20760 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
20770 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
20780 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
20790 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
207a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
207b0 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
207c0 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
207d0 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
207e0 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
207f0 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
20800 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
20810 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
20820 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
20830 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
20840 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
20850 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
20860 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
20870 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
20880 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
20890 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
208a0 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
208b0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
208c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
208d0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
208e0 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
208f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
20900 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20910 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
20920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20930 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b       if( pWC->a[
20940 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
20950 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
20960 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
20970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20980 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
20990 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
209a0 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
209b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
209c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
209d0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
209e0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
209f0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
20a00 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
20a10 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
20a20 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
20a30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
20a40 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
20a50 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
20a60 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
20a70 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
20a80 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
20a90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
20aa0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
20ab0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
20ac0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
20ad0 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
20ae0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
20af0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
20b00 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
20b10 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
20b20 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
20b30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
20b40 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
20b50 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
20b60 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
20b70 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
20b80 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
20b90 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
20ba0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
20bb0 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21  f( pAndExpr && !
20bc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20bd0 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  pOrExpr, EP_From
20be0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
20bf0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
20c00 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
20c10 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
20c20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
20c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
20c40 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
20c50 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
20c60 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
20c70 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
20c80 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
20c90 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
20ca0 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
20cb0 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
20ce0 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45  OPEN_CLOSE | WHE
20cf0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20  RE_AND_ONLY |.  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
20d20 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
20d30 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69  ONETABLE_ONLY, i
20d40 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
20d50 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
20d60 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
20d70 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
20d80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20d90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
20da0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
20db0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
20dc0 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
20dd0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
20de0 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
20df0 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
20e00 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
20e10 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
20e20 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
20e30 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20e40 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
20e50 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
20e60 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
20e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
20e80 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
20e90 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
20ea0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
20eb0 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
20ec0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
20ed0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
20ee0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
20ef0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
20f00 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
20f30 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
20f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20f50 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20f60 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
20f70 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20fa0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
20fb0 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
20fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20fe0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20ff0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
21000 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
21010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21020 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
21030 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
21040 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
21050 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
21060 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
21070 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
21080 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
21090 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
210a0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
210b0 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
210c0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
210d0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
210e0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
210f0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
21100 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
21110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21120 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
21130 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
21140 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
21150 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
21160 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
21170 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
21180 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
21190 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
211a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
211b0 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
211c0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
211d0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
211e0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
211f0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
21200 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
21210 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
21220 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
21230 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
21240 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
21250 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
21260 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
21270 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
21280 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
21290 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
212a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
212b0 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
212c0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
212d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
212e0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
212f0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
21300 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
21310 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
21320 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
21330 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
21340 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
21350 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
21360 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
21370 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
21380 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
21390 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
213a0 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
213b0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
213c0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
213d0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
213e0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
213f0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
21400 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
21410 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
21420 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21430 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
21440 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
21450 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
21460 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d    if( (pSubLoop-
21470 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21480 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
21490 20 20 20 20 20 20 20 20 26 26 20 28 70 53 75 62          && (pSub
214a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
214b0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
214c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
214d0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
214e0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
214f0 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
21500 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
21520 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
21530 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
21540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
21550 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  ov = pSubLoop->u
21560 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
21570 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21580 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
21590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
215a0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
215b0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
215c0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
215d0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
215e0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
215f0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
21600 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
21610 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
21620 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21630 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
21640 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
21650 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
21660 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
21670 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
21680 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
21690 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
216a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
216b0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
216c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45  Parse->db, pAndE
216d0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
216e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
216f0 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
21700 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21710 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
21720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21730 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
21740 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
21750 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
21760 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21770 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
21780 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
21790 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
217a0 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
217b0 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
217c0 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
217d0 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
217e0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
217f0 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
21800 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21810 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
21820 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
21830 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72  /* Case 6:  Ther
21840 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
21850 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
21860 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
21870 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
21880 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
21890 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
218a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
218b0 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
218c0 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
218d0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
218e0 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
218f0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
21900 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
21910 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
21920 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70  bRev==1 );.    p
21930 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
21940 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65  p[bRev];.    pLe
21950 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
21960 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
21970 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
21980 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74  AddOp2(v, aStart
21990 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64  [bRev], iCur, ad
219a0 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
219b0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
219c0 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
219d0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20  CAN_STEP;.  }.  
219e0 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  newNotReady = no
219f0 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
21a00 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
21a10 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
21a20 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
21a30 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
21a40 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
21a50 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
21a60 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
21a70 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
21a80 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
21a90 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
21aa0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
21ab0 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
21ac0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
21ad0 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
21ae0 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
21af0 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
21b00 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
21b10 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
21b20 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
21b30 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
21b40 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
21b50 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
21b60 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
21b70 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
21b80 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
21b90 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
21ba0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
21bb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21bc0 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37  ; /* IMP: R-3057
21bd0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74  5-11662 */.    t
21be0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21bf0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
21c00 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
21c10 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21c20 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
21c30 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
21c40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
21c50 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
21c60 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
21c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
21c80 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  case( pWInfo->un
21c90 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20  testedTerms==0. 
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
21cb0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
21cc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
21cd0 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29  TABLE_ONLY)!=0 )
21ce0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
21cf0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
21d00 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
21d10 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20  e;.    }.    pE 
21d20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
21d30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
21d40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
21d50 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
21d60 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
21d70 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
21d80 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  in) ){.      con
21d90 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
21da0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
21db0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
21dc0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
21dd0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
21de0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
21df0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
21e00 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
21e10 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f   code to test fo
21e20 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72  r implied constr
21e30 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74  aints based on t
21e40 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a  ransitivity.  **
21e50 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65   of the "==" ope
21e60 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
21e70 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
21e80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
21e90 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e  ntains "t1.a=t2.
21ea0 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33  b" and "t2.b=123
21eb0 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72  ".  ** and we ar
21ec0 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20  e coding the t1 
21ed0 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20  loop and the t2 
21ee0 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74  loop has not yet
21ef0 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65   coded,.  ** the
21f00 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  n we cannot use 
21f10 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  the "t1.a=t2.b" 
21f20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20  constraint, but 
21f30 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a  we can code.  **
21f40 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31   the implied "t1
21f50 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69  .a=123" constrai
21f60 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
21f70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
21f80 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
21f90 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
21fa0 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
21fb0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
21fc0 3b 0a 20 20 20 20 45 78 70 72 20 73 45 71 3b 0a  ;.    Expr sEq;.
21fd0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
21fe0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
21ff0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
22000 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
22010 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
22020 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
22030 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
22040 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
22050 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
22060 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
22070 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  ;.    pE = pTerm
22080 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
22090 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
220a0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
220b0 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73  mJoin) );.    as
220c0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72  sert( (pTerm->pr
220d0 65 72 65 71 52 69 67 68 74 20 26 20 6e 65 77 4e  ereqRight & newN
220e0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
220f0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
22100 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
22110 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
22120 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
22130 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
22140 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
22150 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22160 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
22170 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
22180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56   continue;.    V
22190 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
221a0 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69  v, "begin transi
221b0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22  tive constraint"
221c0 29 29 3b 0a 20 20 20 20 73 45 71 20 3d 20 2a 70  ));.    sEq = *p
221d0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
221e0 73 45 71 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  sEq.pLeft = pE->
221f0 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74  pLeft;.    sqlit
22200 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22210 61 72 73 65 2c 20 26 73 45 71 2c 20 61 64 64 72  arse, &sEq, addr
22220 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
22230 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20  PIFNULL);.  }.. 
22240 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
22250 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
22260 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
22270 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
22280 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
22290 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
222a0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
222b0 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
222c0 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
222d0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
222e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
222f0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
22300 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
22310 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22340 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
22350 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
22360 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22370 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
22380 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
22390 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
223a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
223b0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
223c0 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
223d0 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
223e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
223f0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
22400 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
22410 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
22420 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
22430 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
22440 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22450 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
22460 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
22470 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
22480 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
22490 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
224a0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
224b0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
224c0 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
224d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
224e0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
224f0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
22500 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
22510 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
22520 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
22530 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22540 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22550 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
22560 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
22570 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22580 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
22590 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
225a0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
225b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
225c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
225d0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
225e0 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61  return newNotRea
225f0 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  dy;.}..#ifdef WH
22600 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
22610 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
22620 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
22630 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
22640 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
22650 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
22660 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
22670 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  p, SrcList *pTab
22680 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20  List){.  int nb 
22690 3d 20 32 2a 28 28 70 54 61 62 4c 69 73 74 2d 3e  = 2*((pTabList->
226a0 6e 53 72 63 2b 31 35 29 2f 31 36 29 3b 0a 20 20  nSrc+15)/16);.  
226b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
226c0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61  tem *pItem = pTa
226d0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54  bList->a + p->iT
226e0 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ab;.  Table *pTa
226f0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
22700 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
22710 72 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30  rintf("%c %2d.%0
22720 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
22730 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
22740 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
22750 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
22760 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
22770 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
22780 62 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22  bugPrintf(" %8s"
22790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
227a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
227b0 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
227c0 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
227d0 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
227e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
227f0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
22800 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ){.    if( p->u.
22810 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a  btree.pIndex ){.
22820 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
22830 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   *zName = p->u.b
22840 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
22850 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  me;.      if( zN
22860 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d  ame==0 ) zName =
22870 20 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66   "ipk";.      if
22880 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
22890 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
228a0 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
228b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
228c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
228d0 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
228e0 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
228f0 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
22900 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
22910 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
22920 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22930 69 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64  intf(".%-12s %2d
22940 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
22950 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
22960 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22970 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22980 25 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %16s","");.    }
22990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
229a0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
229b0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
229c0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
229d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
229e0 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22a00 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
22a10 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
22a20 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
22a30 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
22a40 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
22a50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
22a60 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
22a70 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
22a80 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
22a90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22aa0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
22ab0 31 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  15s", z);.    sq
22ac0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
22ad0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
22ae0 67 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35  gPrintf(" fg %05
22af0 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
22b00 61 67 73 2c 20 70 2d 3e 6e 54 65 72 6d 29 3b 0a  ags, p->nTerm);.
22b10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22b20 69 6e 74 66 28 22 20 63 6f 73 74 20 25 2e 32 67  intf(" cost %.2g
22b30 2c 25 2e 32 67 2c 25 2e 32 67 5c 6e 22 2c 0a 20  ,%.2g,%.2g\n",. 
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 20 20 70 2d 3e 70 72 65 72 65 71 2c 20 70      p->prereq, p
22b60 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
22b70 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23  n, p->nOut);.}.#
22b80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  endif../*.** Dea
22b90 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
22ba0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
22bb0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
22bc0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
22bd0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
22be0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
22bf0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 73  ereLoop *p){.  s
22c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22c10 20 70 2d 3e 61 54 65 72 6d 29 3b 0a 20 20 70 2d   p->aTerm);.  p-
22c20 3e 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  >aTerm = 0;.  p-
22c30 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 66  >nTerm = 0;.  if
22c40 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
22c50 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
22c60 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  LE)!=0 ){.    if
22c70 28 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  ( p->u.vtab.need
22c80 46 72 65 65 20 29 20 73 71 6c 69 74 65 33 5f 66  Free ) sqlite3_f
22c90 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
22ca0 78 53 74 72 29 3b 0a 20 20 20 20 70 2d 3e 75 2e  xStr);.    p->u.
22cb0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
22cc0 30 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  0;.    p->u.vtab
22cd0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 7d  .idxStr = 0;.  }
22ce0 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
22cf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
22d00 50 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  P_INDEX)!=0 && p
22d10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22d20 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
22d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
22d40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
22d50 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71  zColAff);.    sq
22d60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d70 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22d80 78 29 3b 0a 20 20 20 20 70 2d 3e 75 2e 62 74 72  x);.    p->u.btr
22d90 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
22da0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
22db0 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
22dc0 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
22dd0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
22de0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
22df0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
22e00 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
22e10 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
22e20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
22e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22e40 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
22e50 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
22e60 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
22e70 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
22e80 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22e90 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
22ea0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
22eb0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
22ec0 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
22ed0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
22ee0 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
22ef0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
22f00 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
22f10 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
22f20 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
22f30 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
22f40 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
22f50 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
22f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22f70 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
22f80 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
22f90 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
22fa0 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
22fb0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
22fc0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
22fd0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
22fe0 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
22ff0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
23000 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
23010 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
23020 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
23030 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
23040 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
23050 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
23060 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
23070 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
23080 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
23090 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
230a0 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
230b0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
230c0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
230d0 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
230e0 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
230f0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
23100 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
23110 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
23120 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
23130 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
23140 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
23150 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
23160 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
23170 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
23180 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
23190 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
231a0 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
231b0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
231c0 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
231d0 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
231e0 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
231f0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
23200 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
23210 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
23220 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
23230 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
23240 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
23250 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
23260 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
23270 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
23280 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
23290 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
232a0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
232b0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
232c0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
232d0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
232e0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
232f0 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
23300 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
23310 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
23320 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
23330 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
23340 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
23350 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
23360 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
23370 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
23380 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
23390 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
233a0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
233b0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
233c0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
233d0 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
233e0 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
233f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
23400 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
23410 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
23420 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
23430 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
23440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23450 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
23460 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
23470 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
23480 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
23490 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
234a0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
234b0 78 74 20 3d 20 30 2c 20 2a 70 54 6f 46 72 65 65  xt = 0, *pToFree
234c0 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
234d0 6d 20 2a 2a 70 61 54 65 72 6d 20 3d 20 30 3b 0a  m **paTerm = 0;.
234e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
234f0 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20  pBuilder->db;.  
23500 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
23510 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
23520 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Info;..  /* If p
23530 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69  Builder->pBest i
23540 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
23550 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
23560 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20  of the single.  
23570 2a 2a 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f  ** best WhereLoo
23580 70 2e 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42  p.  pBuilder->pB
23590 65 73 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30  est->maskSelf==0
235a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
235b0 6e 6f 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68  no.  ** prior Wh
235c0 65 72 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65  ereLoops have be
235d0 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
235e0 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
235f0 74 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a  t pTemplate.  **
23600 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 74 68   is therefore th
23610 65 20 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63  e first and henc
23620 65 20 74 68 65 20 62 65 73 74 20 61 6e 64 20 73  e the best and s
23630 68 6f 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65  hould be retaine
23640 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  d..  */.  if( (p
23650 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65   = pBuilder->pBe
23660 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  st)!=0 ){.    if
23670 28 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30  ( p->maskSelf!=0
23680 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
23690 3e 72 52 75 6e 2b 70 2d 3e 72 53 65 74 75 70 20  >rRun+p->rSetup 
236a0 3c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  < pTemplate->rRu
236b0 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  n+pTemplate->rSe
236c0 74 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 67  tup ){.        g
236d0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
236e0 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
236f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  }.      if( p->r
23700 52 75 6e 2b 70 2d 3e 72 53 65 74 75 70 20 3d 3d  Run+p->rSetup ==
23710 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
23720 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  +pTemplate->rSet
23730 75 70 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  up.       && p->
23740 70 72 65 72 65 71 20 3c 3d 20 70 54 65 6d 70 6c  prereq <= pTempl
23750 61 74 65 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ate->prereq ){. 
23760 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
23770 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
23780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23790 20 20 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70 6c      *p = *pTempl
237a0 61 74 65 3b 0a 20 20 20 20 70 2d 3e 61 54 65 72  ate;.    p->aTer
237b0 6d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 75 2e  m = 0;.    p->u.
237c0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
237d0 30 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  0;.#if WHERETRAC
237e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
237f0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
23800 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
23810 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23820 72 69 6e 74 66 28 22 69 6e 73 2d 62 65 73 74 3a  rintf("ins-best:
23830 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
23840 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
23850 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
23860 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
23870 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
23880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
23890 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
238a0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
238b0 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77  ereLoop to overw
238c0 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74  rite, or which t
238d0 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69  akes.  ** priori
238e0 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74  ty over pTemplat
238f0 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  e..  */.  for(pp
23900 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c  Prev=&pWInfo->pL
23910 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b  oops, p=*ppPrev;
23920 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
23930 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
23940 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
23950 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
23960 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
23970 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
23980 2d 3e 69 53 6f 72 74 49 64 78 20 29 20 63 6f 6e  ->iSortIdx ) con
23990 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
239a0 2d 3e 6e 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74  ->nTerm<pTemplat
239b0 65 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 26 26  e->nTerm.     &&
239c0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
239d0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
239e0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
239f0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
23a00 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
23a10 0a 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74  .     && p->u.bt
23a20 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d  ree.pIndex==pTem
23a30 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70  plate->u.btree.p
23a40 49 6e 64 65 78 0a 20 20 20 20 20 26 26 20 70 2d  Index.     && p-
23a50 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61  >prereq==pTempla
23a60 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
23a70 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77  {.      /* Overw
23a80 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
23a90 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
23aa0 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74  an similar one t
23ab0 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 2a  hat uses.      *
23ac0 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  * more terms of 
23ad0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
23ae0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
23af0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
23b00 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
23b10 2c 20 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , p);.      brea
23b20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
23b30 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
23b40 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
23b50 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ==p->prereq.    
23b60 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
23b70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23b80 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
23b90 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
23ba0 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  n.    ){.      /
23bb0 2a 20 41 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e  * Already holdin
23bc0 67 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 62 65  g an equal or be
23bd0 74 74 65 72 20 57 68 65 72 65 4c 6f 6f 70 2e 0a  tter WhereLoop..
23be0 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20        ** Return 
23bf0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
23c00 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68   or adding anyth
23c10 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  ing */.      got
23c20 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  o whereLoopInser
23c30 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  t_noop;.    }.  
23c40 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
23c50 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
23c60 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
23c70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
23c80 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
23c90 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20  plate->rSetup.  
23ca0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
23cb0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
23cc0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f     ){.      /* O
23cd0 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
23ce0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
23cf0 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65  ith a better one
23d00 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20   */.      pNext 
23d10 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
23d20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 43        whereLoopC
23d30 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 20  lear(db, p);.   
23d40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23d50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
23d60 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
23d70 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
23d80 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
23d90 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
23da0 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
23db0 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
23dc0 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
23dd0 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
23de0 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
23df0 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
23e00 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
23e10 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
23e20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
23e30 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
23e40 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
23e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23e60 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
23e70 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
23e80 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
23e90 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62  , pBuilder->pTab
23ea0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
23eb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23ec0 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
23ed0 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
23ee0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
23ef0 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c   pBuilder->pTabL
23f00 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
23f10 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
23f20 20 20 20 70 20 3d 20 70 54 6f 46 72 65 65 20 3d     p = pToFree =
23f30 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23f40 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
23f50 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
23f60 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
23f70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23f80 20 20 7d 0a 20 20 69 66 28 20 70 54 65 6d 70 6c    }.  if( pTempl
23f90 61 74 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20  ate->nTerm ){.  
23fa0 20 20 70 61 54 65 72 6d 20 3d 20 73 71 6c 69 74    paTerm = sqlit
23fb0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
23fc0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65  , pTemplate->nTe
23fd0 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65  rm*sizeof(p->aTe
23fe0 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  rm[0]));.    if(
23ff0 20 70 61 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20   paTerm==0 ){.  
24000 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24010 65 28 64 62 2c 20 70 54 6f 46 72 65 65 29 3b 0a  e(db, pToFree);.
24020 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24030 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
24040 0a 20 20 7d 0a 20 20 2a 70 20 3d 20 2a 70 54 65  .  }.  *p = *pTe
24050 6d 70 6c 61 74 65 3b 0a 20 20 70 2d 3e 70 4e 65  mplate;.  p->pNe
24060 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a  xtLoop = pNext;.
24070 20 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20    *ppPrev = p;. 
24080 20 70 2d 3e 61 54 65 72 6d 20 3d 20 70 61 54 65   p->aTerm = paTe
24090 72 6d 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 65  rm;.  if( p->nTe
240a0 72 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  rm ){.    memcpy
240b0 28 70 2d 3e 61 54 65 72 6d 2c 20 70 54 65 6d 70  (p->aTerm, pTemp
240c0 6c 61 74 65 2d 3e 61 54 65 72 6d 2c 20 70 2d 3e  late->aTerm, p->
240d0 6e 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e  nTerm*sizeof(p->
240e0 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a  aTerm[0]));.  }.
240f0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
24100 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24110 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
24120 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
24130 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
24140 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
24150 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
24160 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
24170 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24180 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
24190 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 6d 70 6c  else{.    pTempl
241a0 61 74 65 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  ate->u.vtab.need
241b0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
241c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
241d0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
241e0 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  e if the insert 
241f0 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68  is a no-op */.wh
24200 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
24210 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41  op:.#if WHERETRA
24220 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
24230 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
24240 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
24250 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24260 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29  tf("ins-noop: ")
24270 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
24280 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
24290 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69  pBuilder->pTabLi
242a0 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
242b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
242c0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  OK;  .}../*.** W
242d0 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
242e0 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
242f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24300 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  q terms of the i
24310 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20  ndex pIndex..** 
24320 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
24330 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   more..**.** If 
24340 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
24350 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
24360 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
24370 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
24380 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
24390 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
243a0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
243b0 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
243c0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
243d0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
243e0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
243f0 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
24400 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24410 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
24420 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
24430 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
24440 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
24450 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
24460 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
24470 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  x on pSrc */.  i
24480 6e 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  nt nInMul       
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  * Number of iter
244b0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
244c0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
244d0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
244e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
244f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
24500 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
24510 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
24520 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
24530 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
24540 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
24550 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
24560 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
24570 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
24580 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
24590 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
245a0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
245b0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
245c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
245d0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
245e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
245f0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
24600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24610 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
24620 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
24630 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 61 76  .  WhereLoop sav
24640 65 64 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  edLoop;         
24650 20 20 20 2f 2a 20 53 61 76 65 64 20 6f 72 69 67     /* Saved orig
24660 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  inal content of 
24670 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
24680 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
24690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
246a0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
246b0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
246c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
246d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
246e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
246f0 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
24700 20 69 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   iRowEst;       
24710 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
24720 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65  mated index sele
24730 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 64 6f 75  ctivity */.  dou
24740 62 6c 65 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ble rLogSize;   
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24760 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
24770 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
24780 72 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70  reTerm *pTop, *p
24790 42 74 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Btm;         /* 
247a0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
247b0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
247c0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 42 75 69   */..  db = pBui
247d0 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  lder->db;.  pNew
247e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
247f0 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
24800 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
24810 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24820 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
24830 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
24840 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
24850 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24860 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24870 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
24880 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
24890 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
248a0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
248b0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
248c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
248d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
248e0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
248f0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
24900 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
24910 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63  tnum<=0 || (pSrc
24920 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
24930 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
24940 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
24950 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
24960 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
24970 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73  }else{.    opMas
24980 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
24990 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c  WO_ISNULL|WO_GT|
249a0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
249b0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  E;.  }.  if( pPr
249c0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
249d0 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
249e0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
249f0 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66 28 20 70  WO_LE);..  if( p
24a00 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24a10 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   < pProbe->nColu
24a20 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  mn ){.    iCol =
24a30 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
24a40 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  n[pNew->u.btree.
24a50 6e 45 71 5d 3b 0a 20 20 20 20 69 52 6f 77 45 73  nEq];.    iRowEs
24a60 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
24a70 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  wEst[pNew->u.btr
24a80 65 65 2e 6e 45 71 2b 31 5d 3b 0a 20 20 7d 65 6c  ee.nEq+1];.  }el
24a90 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d  se{.    iCol = -
24aa0 31 3b 0a 20 20 20 20 69 52 6f 77 45 73 74 20 3d  1;.    iRowEst =
24ab0 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20   1;.  }.  pTerm 
24ac0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
24ad0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
24ae0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
24af0 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
24b20 65 29 3b 0a 20 20 73 61 76 65 64 4c 6f 6f 70 20  e);.  savedLoop 
24b30 3d 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d  = *pNew;.  pNew-
24b40 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c  >rSetup = (doubl
24b50 65 29 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  e)0;.  rLogSize 
24b60 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d  = estLog(pProbe-
24b70 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20  >aiRowEst[0]);. 
24b80 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
24b90 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
24ba0 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
24bb0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
24bc0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 31  .    int nIn = 1
24bd0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24be0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
24bf0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
24c00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e  continue;.    pN
24c10 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
24c20 76 65 64 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 3b  vedLoop.wsFlags;
24c30 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
24c40 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 4c 6f  ee.nEq = savedLo
24c50 6f 70 2e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  op.u.btree.nEq;.
24c60 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
24c70 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 54 65 72  = savedLoop.nTer
24c80 6d 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  m;.    if( pNew-
24c90 3e 6e 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72  >nTerm>=pBuilder
24ca0 2d 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b  ->mxTerm ) break
24cb0 3b 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 6f  ; /* Repeated co
24cc0 6c 75 6d 6e 20 69 6e 20 69 6e 64 65 78 20 2a 2f  lumn in index */
24cd0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d  .    pNew->aTerm
24ce0 5b 70 4e 65 77 2d 3e 6e 54 65 72 6d 2b 2b 5d 20  [pNew->nTerm++] 
24cf0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
24d00 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
24d10 65 64 4c 6f 6f 70 2e 70 72 65 72 65 71 20 7c 20  edLoop.prereq | 
24d20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
24d30 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
24d40 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d  kSelf;.    pNew-
24d50 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65  >rRun = rLogSize
24d60 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24d70 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24d80 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
24d90 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
24da0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
24db0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24dc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
24dd0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
24de0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24df0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
24e00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
24e10 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
24e20 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45  :  Assume the SE
24e30 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
24e40 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
24e50 6e 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20 20 20  nIn = 25;.      
24e60 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
24e70 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
24e80 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
24e90 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
24ea0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
24eb0 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
24ec0 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
24ed0 6e 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  n = pExpr->x.pLi
24ee0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
24ef0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72   }.      pNew->r
24f00 52 75 6e 20 2a 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run *= nIn;.    
24f10 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
24f20 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
24f30 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c  w->nOut = (doubl
24f40 65 29 69 52 6f 77 45 73 74 20 2a 20 6e 49 6e 4d  e)iRowEst * nInM
24f50 75 6c 20 2a 20 6e 49 6e 3b 0a 20 20 20 20 7d 65  ul * nIn;.    }e
24f60 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
24f70 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
24f80 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  Q) ){.      asse
24f90 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
24fa0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
24fb0 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
24fc0 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20  LUMN_IN))!=0.   
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
24fe0 7c 20 6e 49 6e 4d 75 6c 3d 3d 31 20 29 3b 0a 20  | nInMul==1 );. 
24ff0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
25000 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
25010 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  MN_EQ;.      if(
25020 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20   iCol<0  .      
25030 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45   || (pProbe->onE
25040 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
25050 20 6e 49 6e 4d 75 6c 3d 3d 31 0a 20 20 20 20 20   nInMul==1.     
25060 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
25070 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f  .btree.nEq==pPro
25080 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20  be->nColumn-1). 
25090 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
250a0 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
250b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
250c0 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20  COLUMN_IN );.   
250d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
250e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
250f0 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OW;.      }.    
25100 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
25110 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
25120 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c  w->nOut = (doubl
25130 65 29 69 52 6f 77 45 73 74 20 2a 20 6e 49 6e 4d  e)iRowEst * nInM
25140 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ul;.    }else if
25150 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
25160 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
25170 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
25180 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
25190 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20  _COLUMN_NULL;.  
251a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
251b0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 6e  e.nEq++;.      n
251c0 49 6e 20 3d 20 32 3b 20 20 2f 2a 20 41 73 73 75  In = 2;  /* Assu
251d0 6d 65 20 49 53 20 4e 55 4c 4c 20 6d 61 74 63 68  me IS NULL match
251e0 65 73 20 74 77 6f 20 72 6f 77 73 20 2a 2f 0a 20  es two rows */. 
251f0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
25200 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73  = (double)iRowEs
25210 74 20 2a 20 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e  t * nInMul * nIn
25220 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25230 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
25240 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
25250 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
25260 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
25270 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
25280 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
25290 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
252a0 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
252b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
252c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
252d0 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
252e0 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) ){.      pNew-
252f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
25300 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
25310 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
25320 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
25330 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
25340 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
25350 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
25360 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
25380 77 2d 3e 61 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  w->aTerm[pNew->n
25390 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
253a0 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d   }.    if( pNew-
253b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
253c0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
253d0 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
253e0 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66   nOut and rRun f
253f0 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76  or STAT3 range v
25400 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 64  alues */.      d
25410 6f 75 62 6c 65 20 72 44 69 76 3b 0a 20 20 20 20  ouble rDiv;.    
25420 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
25430 45 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 50  Est(pBuilder->pP
25440 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 4e  arse, pProbe, pN
25450 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2c  ew->u.btree.nEq,
25460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25470 20 20 20 20 20 20 20 20 20 70 42 74 6d 2c 20 70           pBtm, p
25480 54 6f 70 2c 20 26 72 44 69 76 29 3b 0a 20 20 20  Top, &rDiv);.   
25490 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
254a0 73 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 72  savedLoop.nOut/r
254b0 44 69 76 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Div;.    }.#ifde
254c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
254d0 53 54 41 54 33 0a 20 20 20 20 69 66 28 20 70 4e  STAT3.    if( pN
254e0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
254f0 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53  =1 && pProbe->nS
25500 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  ample ){.      i
25510 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
25520 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
25530 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
25540 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
25550 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
25560 42 75 69 6c 64 65 72 2d 3e 70 50 61 72 73 65 2c  Builder->pParse,
25570 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
25580 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20  pExpr->pRight,. 
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
255b0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
255c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
255d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
255e0 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20  WO_IN).         
255f0 20 20 20 20 26 26 20 20 21 45 78 70 72 48 61 73      &&  !ExprHas
25600 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
25610 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25620 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20  ect)  ){.       
25630 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
25640 6e 45 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  nEst(pBuilder->p
25650 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
25660 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
25670 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b     &pNew->nOut);
256a0 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ..      }.    }.
256b0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
256c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
256d0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
256e0 48 45 52 45 5f 49 50 4b 29 20 29 7b 0a 20 20 20  HERE_IPK) ){.   
256f0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
25700 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f 2a   pNew->nOut;  /*
25710 20 55 6e 69 74 20 73 74 65 70 20 63 6f 73 74 20   Unit step cost 
25720 74 6f 20 72 65 61 63 68 20 65 61 63 68 20 72 6f  to reach each ro
25730 77 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  w */.    }else{.
25740 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f        /* Each ro
25750 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65  w involves a ste
25760 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  p of the index, 
25770 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65  then a binary se
25780 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a  arch of.      **
25790 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
257a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
257b0 52 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75  Run += pNew->nOu
257c0 74 2a 28 31 20 2b 20 72 4c 6f 67 53 69 7a 65 29  t*(1 + rLogSize)
257d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  ;.    }.    /* T
257e0 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20  BD: Adjust nOut 
257f0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  for additional c
25800 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
25810 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
25820 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
25830 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
25840 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
25850 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
25860 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
25870 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
25880 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
25890 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
258a0 7a 4e 61 6d 65 21 3d 30 0a 20 20 20 20 29 7b 0a  zName!=0.    ){.
258b0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
258c0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
258d0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
258e0 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29  obe, nInMul*nIn)
258f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
25900 4e 65 77 20 3d 20 73 61 76 65 64 4c 6f 6f 70 3b  New = savedLoop;
25910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25920 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
25930 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
25940 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
25950 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
25960 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
25970 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
25980 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
25990 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
259a0 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
259b0 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
259c0 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
259d0 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
259e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
259f0 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
25a00 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
25a10 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
25a20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
25a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25a40 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
25a50 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
25a60 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
25a70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
25a80 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
25a90 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
25aa0 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
25ab0 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 69  t iCol;.  int ii
25ac0 3b 0a 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  ;..  if( (pOB = 
25ad0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
25ae0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
25af0 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 49 6e 64  0;.  iCol = pInd
25b00 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b  ex->aiColumn[0];
25b10 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
25b20 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
25b30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
25b40 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
25b50 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
25b60 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
25b70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
25b80 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
25b90 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
25ba0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
25bb0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
25bc0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
25bd0 6d 6e 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72  mn==iCol ) retur
25be0 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n 1;.      retur
25bf0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
25c00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
25c10 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
25c20 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 20  eLoop objects a 
25c30 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
25c40 74 68 65 20 6a 6f 69 6e 20 77 65 72 65 20 74 68  the join were th
25c50 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
25c60 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
25c70 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
25c80 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
25c90 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
25ca0 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
25cb0 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
25cc0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
25cd0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
25ce0 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
25cf0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
25d00 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
25d10 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
25d20 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
25d30 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
25d40 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
25d50 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
25d60 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
25d70 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
25d80 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
25d90 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
25da0 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
25db0 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
25dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25dd0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
25de0 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
25df0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
25e00 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77  .  tRowcnt aiRow
25e10 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f  EstPk[2];      /
25e20 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
25e30 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
25e40 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
25e50 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  t aiColumnPk = -
25e60 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
25e70 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
25e80 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
25e90 65 78 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ex */.  struct S
25ea0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
25eb0 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
25ec0 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
25ed0 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
25ee0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
25ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
25f00 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
25f10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
25f20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25f30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25f40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
25f50 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
25f60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25f70 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
25f80 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
25f90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
25fa0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
25fb0 20 64 6f 75 62 6c 65 20 72 53 69 7a 65 3b 20 20   double rSize;  
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25fd0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
25fe0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
25ff0 20 64 6f 75 62 6c 65 20 72 4c 6f 67 53 69 7a 65   double rLogSize
26000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26010 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
26020 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
26030 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
26040 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
26050 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
26060 72 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  rc = pBuilder->p
26070 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
26080 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73 73 65 72  w->iTab;.  asser
26090 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
260a0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
260b0 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
260c0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
260d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
260e0 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
260f0 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
26100 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
26110 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
26120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26130 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
26140 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
26150 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
26160 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
26170 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
26180 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
26190 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
261a0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
261b0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
261c0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
261d0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
261e0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
261f0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
26200 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
26210 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
26220 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
26230 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
26240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26250 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
26260 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
26270 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
26280 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
26290 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
262a0 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
262b0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
262c0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
262d0 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d    sPk.aiRowEst =
262e0 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
262f0 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
26300 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
26310 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63  Pk.pTable = pSrc
26320 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f  ->pTab;.    aiRo
26330 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63  wEstPk[0] = pSrc
26340 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  ->pTab->nRowEst;
26350 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
26360 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72  1] = 1;.    pFir
26370 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
26380 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
26390 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
263a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
263b0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
263c0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
263d0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
263e0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
263f0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
26400 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
26410 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
26420 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
26430 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
26440 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
26450 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
26460 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 28 64 6f   }.  rSize = (do
26470 75 62 6c 65 29 70 53 72 63 2d 3e 70 54 61 62 2d  uble)pSrc->pTab-
26480 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 72 4c 6f 67  >nRowEst;.  rLog
26490 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
264a0 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 6f  ize);..  /* Auto
264b0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
264c0 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
264d0 2d 3e 70 42 65 73 74 0a 20 20 20 26 26 20 28 70  ->pBest.   && (p
264e0 42 75 69 6c 64 65 72 2d 3e 70 50 61 72 73 65 2d  Builder->pParse-
264f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
26500 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
26510 30 20 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  0 .   && !pSrc->
26520 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20  viaCoroutine.   
26530 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  && !pSrc->notInd
26540 65 78 65 64 0a 20 20 20 26 26 20 21 70 53 72 63  exed.   && !pSrc
26550 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20  ->isCorrelated. 
26560 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
26570 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
26580 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
26590 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
265a0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
265b0 43 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  C;.    WhereTerm
265c0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
265d0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
265e0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
265f0 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
26600 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
26610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
26620 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
26630 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
26640 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
26650 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
26660 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
26670 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
26680 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
26690 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
266a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
266b0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
266c0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
266d0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
266e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65         pNew->nTe
266f0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
26700 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d  pNew->aTerm[0] =
26710 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
26720 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 32  pNew->rSetup = 2
26730 30 2a 72 4c 6f 67 53 69 7a 65 2a 70 53 72 63 2d  0*rLogSize*pSrc-
26740 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a  >pTab->nRowEst;.
26750 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26760 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 3b  ut = (double)10;
26770 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
26780 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  Run = rLogSize +
26790 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
267a0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
267b0 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs = WHERE_TEMP_
267c0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
267d0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
267e0 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
267f0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
26800 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
26810 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
26820 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
26830 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26840 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
26850 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
26860 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
26870 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
26880 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
26890 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
268a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
268b0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
268c0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  New->nTerm = 0;.
268d0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
268e0 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
268f0 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62  ->rSetup = (doub
26900 6c 65 29 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  le)0;.    pNew->
26910 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
26920 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26930 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
26940 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
26950 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
26960 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
26970 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
26980 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
26990 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
269a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
269b0 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
269c0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
269d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
269e0 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
269f0 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
26a00 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
26a10 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
26a20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
26a30 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
26a40 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
26a50 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 28 72 53  pNew->rRun = (rS
26a60 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a  ize + rLogSize)*
26a70 28 33 2b 62 29 3b 20 2f 2a 20 34 78 20 70 65 6e  (3+b); /* 4x pen
26a80 61 6c 74 79 20 66 6f 72 20 61 20 66 75 6c 6c 2d  alty for a full-
26a90 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 72 63  scan */.      rc
26aa0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
26ab0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
26ac0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
26ad0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
26ae0 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
26af0 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  sk m = pSrc->col
26b00 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  Used;.      int 
26b10 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  j;.      for(j=p
26b20 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  Probe->nColumn-1
26b30 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
26b40 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
26b50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  robe->aiColumn[j
26b60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
26b70 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
26b80 20 20 20 20 6d 20 26 3d 20 7e 4d 41 53 4b 42 49      m &= ~MASKBI
26b90 54 28 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(x);.        }.
26ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
26bb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
26bc0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
26bd0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
26be0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
26bf0 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a  DEXED;..      /*
26c00 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
26c10 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
26c20 28 20 28 6d 3d 3d 30 20 7c 7c 20 62 29 0a 20 20  ( (m==0 || b).  
26c30 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
26c40 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
26c50 20 20 20 20 20 26 26 20 28 70 42 75 69 6c 64 65       && (pBuilde
26c60 72 2d 3e 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  r->pWC->wctrlFla
26c70 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
26c80 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
26c90 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
26ca0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
26cb0 65 43 69 73 0a 20 20 20 20 20 20 20 26 26 20 4f  eCis.       && O
26cc0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
26cd0 65 64 28 70 42 75 69 6c 64 65 72 2d 3e 70 50 61  ed(pBuilder->pPa
26ce0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
26cf0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
26d00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
26d10 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
26d20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
26d30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26d40 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
26d50 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
26d60 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 72 53 69   = (m==0) ? (rSi
26d70 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28  ze + rLogSize)*(
26d80 31 2b 62 29 20 3a 20 28 72 53 69 7a 65 2a 72 4c  1+b) : (rSize*rL
26d90 6f 67 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  ogSize);.       
26da0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26db0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26dc0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
26dd0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
26de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26df0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
26e00 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
26e10 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
26e20 6f 62 65 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a  obe, 1);..    /*
26e30 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
26e40 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
26e50 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
26e60 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
26e70 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
26e80 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
26e90 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65  rc->pIndex ) bre
26ea0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
26eb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
26ec0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
26ed0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
26ee0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
26ef0 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
26f00 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
26f10 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
26f20 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
26f30 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
26f40 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
26f50 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
26f60 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65  ddVirtual(.  Whe
26f70 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
26f80 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45  Builder,  /* WHE
26f90 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
26fa0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
26fb0 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
26fc0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
26fd0 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
26fe0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
26ff0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73  ble */.){.  Pars
27000 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
27010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27020 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
27030 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
27040 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
27050 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
27060 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
27070 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27080 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
27090 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
270a0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
270b0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
270c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
270d0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
270e0 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
270f0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
27100 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
27110 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
27120 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
27130 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
27140 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
27150 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
27160 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
27170 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
27180 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271a0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
271b0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
271c0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
271d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
271e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
271f0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
27200 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
27210 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
27240 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
27250 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
27260 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27270 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
27280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50  SQLITE_OK;..  pP
27290 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d  arse = pBuilder-
272a0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
272b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
272c0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
272d0 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
272e0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
272f0 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e  rc = &pBuilder->
27300 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
27310 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
27320 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
27330 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
27340 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
27350 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
27360 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
27370 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
27380 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
27390 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
273a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
273b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
273c0 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
273d0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
273e0 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
273f0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
27400 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
27410 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  >nTerm = 0;.  pN
27420 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
27430 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67  ree = 0;.  pUsag
27440 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
27450 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
27460 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
27470 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
27480 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
27490 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
274a0 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
274b0 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
274c0 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
274d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
274e0 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
274f0 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
27500 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
27510 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
27520 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
27530 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
27540 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
27550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
27560 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
27570 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
27580 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
27590 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
275a0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
275b0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
275c0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
275d0 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
275e0 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
275f0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
27600 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
27610 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
27620 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
27630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27640 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27650 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
27660 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
27670 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
27680 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
27690 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30  ->prereqRight!=0
276a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
276b0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
276c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
276d0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
276e0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
276f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27710 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
27720 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
27730 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
27740 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
27750 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
27760 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
27770 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
27780 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
27790 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
277a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
277b0 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
277c0 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
277d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
277e0 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
277f0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
27800 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
27810 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27820 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
27830 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27840 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
27850 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
27860 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
27870 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
27880 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
27890 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
278a0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
278b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
278c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
278d0 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
278e0 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
278f0 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
27900 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
27910 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
27920 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
27930 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
27940 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
27950 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
27960 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
27970 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
27980 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
27990 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
279a0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
279b0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
279c0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
279d0 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29    /* ((double)2)
279e0 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
279f0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
27a00 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20  _POINT... */.   
27a10 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
27a20 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
27a30 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f  E_BIG_DBL / ((do
27a40 75 62 6c 65 29 32 29 3b 0a 20 20 20 20 72 63 20  uble)2);.    rc 
27a50 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
27a60 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49  pParse, pTab, pI
27a70 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  dxInfo);.    if(
27a80 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
27a90 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
27aa0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
27ab0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
27ac0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
27ad0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
27ae0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
27af0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
27b00 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  0;.    mxTerm = 
27b10 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  -1;.    for(i=0;
27b20 20 69 3c 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54   i<pBuilder->mxT
27b30 65 72 6d 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  erm; i++) pNew->
27b40 61 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  aTerm[i] = 0;.  
27b50 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
27b60 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
27b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
27b80 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
27b90 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
27ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
27bb0 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69  iTerm = pUsage[i
27bc0 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29  ].argvIndex - 1)
27bd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
27be0 66 28 20 69 54 65 72 6d 3e 3d 70 42 75 69 6c 64  f( iTerm>=pBuild
27bf0 65 72 2d 3e 6d 78 54 65 72 6d 20 29 20 62 72 65  er->mxTerm ) bre
27c00 61 6b 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  ak;.        j = 
27c10 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
27c20 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
27c30 66 28 20 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e  f( iTerm>=pIdxIn
27c40 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  fo->nConstraint.
27c50 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
27c60 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
27c70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
27c80 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72     || pNew->aTer
27c90 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
27ca0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
27cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
27cc0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
27cd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27ce0 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
27cf0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
27d00 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
27d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
27d20 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
27d30 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
27d40 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d   }.        pTerm
27d50 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
27d60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
27d70 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
27d80 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
27d90 20 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69     pNew->aTerm[i
27da0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
27db0 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
27dc0 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
27dd0 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
27de0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
27df0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
27e00 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
27e10 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
27e20 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
27e30 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
27e40 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
27e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
27e60 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
27e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27e80 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
27e90 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
27ea0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
27eb0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
27ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27ed0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
27ee0 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
27ef0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
27f00 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
27f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27f20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
27f30 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
27f40 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
27f50 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
27f60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
27f70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
27f80 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
27f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27fb0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
27fc0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
27fd0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
27fe0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
27ff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
28000 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
28010 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
28020 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
28030 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
28040 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
28050 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
28060 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
28070 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
28080 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
28090 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
280a0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
280b0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
280c0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
280d0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
280e0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
280f0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
28100 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
28110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28120 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
28130 69 3e 3d 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  i>=pIdxInfo->nCo
28140 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
28150 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20    pNew->nTerm = 
28160 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20  mxTerm+1;.      
28170 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
28180 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
28190 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e  idxNum;.      pN
281a0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
281b0 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ree = pIdxInfo->
281c0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
281d0 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
281e0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
281f0 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  tr = 0;.      pN
28200 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
28210 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  r = pIdxInfo->id
28220 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  xStr;.      pNew
28230 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
28240 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78 49  ed = (u8)((pIdxI
28250 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30  nfo->nOrderBy!=0
28260 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49 6e         && pIdxIn
28290 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
282a0 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  med);.      pNew
282b0 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62  ->rSetup = (doub
282c0 6c 65 29 30 3b 0a 20 20 20 20 20 20 70 4e 65 77  le)0;.      pNew
282d0 2d 3e 72 52 75 6e 20 3d 20 70 49 64 78 49 6e 66  ->rRun = pIdxInf
282e0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
282f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
28300 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 35 3b  ut = (double)25;
28310 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28320 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28330 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
28340 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
28350 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
28360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28370 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
28380 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
28390 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
283a0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
283b0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
283c0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
283d0 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
283e0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
283f0 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
28400 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
28410 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
28420 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
28430 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
28440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
28450 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
28460 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
28470 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
28480 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
28490 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
284a0 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
284b0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
284c0 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
284d0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
284e0 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
284f0 72 61 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  ra){.  WhereClau
28500 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
28510 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
28520 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
28530 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
28540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28550 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
28560 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
28570 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
28580 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
28590 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73 74   WhereLoop sBest
285a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
285b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
285c0 20 20 0a 0a 20 20 70 57 43 20 3d 20 70 42 75 69    ..  pWC = pBui
285d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
285e0 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73   pWC->wctrlFlags
285f0 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
28600 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
28610 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
28620 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
28630 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
28640 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
28650 20 70 49 74 65 6d 20 3d 20 70 42 75 69 6c 64 65   pItem = pBuilde
28660 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  r->pTabList->a +
28670 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
28680 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
28690 72 73 6f 72 3b 0a 20 20 73 53 75 62 42 75 69 6c  rsor;.  sSubBuil
286a0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
286b0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
286c0 72 42 79 20 3d 20 30 3b 0a 20 20 73 53 75 62 42  rBy = 0;.  sSubB
286d0 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73 42  uild.pBest = &sB
286e0 65 73 74 3b 0a 20 20 74 65 6d 70 57 43 2e 70 50  est;.  tempWC.pP
286f0 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
28700 73 65 3b 0a 20 20 74 65 6d 70 57 43 2e 70 4d 61  se;.  tempWC.pMa
28710 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
28720 73 6b 53 65 74 3b 0a 20 20 74 65 6d 70 57 43 2e  skSet;.  tempWC.
28730 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
28740 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
28750 4e 44 3b 0a 20 20 74 65 6d 70 57 43 2e 77 63 74  ND;.  tempWC.wct
28760 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 74  rlFlags = 0;.  t
28770 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
28780 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
28790 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
287a0 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
287b0 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
287c0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
287d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
287e0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
287f0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
28800 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
28810 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
28820 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
28830 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
28840 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
28850 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
28860 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
28870 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
28880 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
28890 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
288a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
288b0 54 65 72 6d 3b 0a 20 20 20 20 20 20 64 6f 75 62  Term;.      doub
288c0 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20  le rTotal = 0;. 
288d0 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77       double nRow
288e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d   = 0;.      Bitm
288f0 61 73 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78  ask prereq = mEx
28900 74 72 61 3b 0a 0a 0a 20 20 20 20 20 20 66 6f 72  tra;...      for
28910 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
28920 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
28930 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
28940 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
28950 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
28960 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
28970 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
28980 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
28990 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
289a0 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
289b0 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
289c0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
289d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
289e0 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
289f0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
28a00 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
28a10 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
28a20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
28a30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
28a40 0a 20 20 20 20 20 20 20 20 73 42 65 73 74 2e 6d  .        sBest.m
28a50 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20 20 20  askSelf = 0;.   
28a60 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
28a70 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
28a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28a90 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
28aa0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
28ab0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
28ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28ad0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
28ae0 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
28af0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
28b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b10 20 20 69 66 28 20 73 42 65 73 74 2e 6d 61 73 6b    if( sBest.mask
28b20 53 65 6c 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Self==0 ) break;
28b30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28b40 20 73 42 65 73 74 2e 72 53 65 74 75 70 3d 3d 28   sBest.rSetup==(
28b50 64 6f 75 62 6c 65 29 30 20 29 3b 0a 20 20 20 20  double)0 );.    
28b60 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42      rTotal += sB
28b70 65 73 74 2e 72 52 75 6e 3b 0a 20 20 20 20 20 20  est.rRun;.      
28b80 20 20 6e 52 6f 77 20 2b 3d 20 73 42 65 73 74 2e    nRow += sBest.
28b90 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 72  nOut;.        pr
28ba0 65 72 65 71 20 7c 3d 20 73 42 65 73 74 2e 70 72  ereq |= sBest.pr
28bb0 65 72 65 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ereq;.      }.  
28bc0 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
28bd0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
28be0 3e 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  >aTerm[0] = pTer
28bf0 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
28c00 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
28c10 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
28c20 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64  New->rSetup = (d
28c30 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20 20 20 70  ouble)0;.      p
28c40 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 54 6f 74  New->rRun = rTot
28c50 61 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  al;.      pNew->
28c60 6e 4f 75 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nOut = nRow;.   
28c70 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
28c80 3d 20 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  = prereq;.      
28c90 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
28ca0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
28cb0 3e 75 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >u));.      rc =
28cc0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
28cd0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
28ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28cf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28d00 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
28d10 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
28d20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
28d30 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
28d40 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
28d50 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
28d60 6c 64 65 72 29 7b 0a 20 20 42 69 74 6d 61 73 6b  lder){.  Bitmask
28d70 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
28d80 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
28d90 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
28da0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
28db0 73 74 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  st = pBuilder->p
28dc0 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
28dd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28de0 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
28df0 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
28e00 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 71 6c  lder->pWC;.  sql
28e10 69 74 65 33 20 2a 64 62 20 3d 20 70 42 75 69 6c  ite3 *db = pBuil
28e20 64 65 72 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  der->db;.  int n
28e30 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c 64  TabList = pBuild
28e40 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  er->pWInfo->nLev
28e50 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
28e60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
28e70 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
28e80 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
28e90 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
28ea0 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
28eb0 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 42 75  o right */.  pBu
28ec0 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d 20 70 4e  ilder->pNew = pN
28ed0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
28ee0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
28ef0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
28f00 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
28f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28f20 4f 4d 45 4d 3b 0a 20 20 70 42 75 69 6c 64 65 72  OMEM;.  pBuilder
28f30 2d 3e 6d 78 54 65 72 6d 20 3d 20 70 57 43 2d 3e  ->mxTerm = pWC->
28f40 6e 54 65 72 6d 2b 31 3b 0a 20 20 77 68 69 6c 65  nTerm+1;.  while
28f50 28 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 29 7b  ( pWC->pOuter ){
28f60 0a 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e  .    pWC = pWC->
28f70 70 4f 75 74 65 72 3b 0a 20 20 20 20 70 42 75 69  pOuter;.    pBui
28f80 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20 2b 3d 20  lder->mxTerm += 
28f90 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 7d 0a  pWC->nTerm;.  }.
28fa0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
28fb0 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->pWC;.  pNew->a
28fc0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Term = sqlite3Db
28fd0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 70 42  MallocZero(db,pB
28fe0 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 2a 73  uilder->mxTerm*s
28ff0 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 54 65 72  izeof(pNew->aTer
29000 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 4e  m[0]));.  if( pN
29010 65 77 2d 3e 61 54 65 72 6d 3d 3d 30 20 29 7b 0a  ew->aTerm==0 ){.
29020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29030 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
29040 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 5f  whereLoopAddAll_
29050 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  end;.  }.  for(i
29060 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
29070 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
29080 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
29090 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
290a0 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
290b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
290c0 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 70  Self = getMask(p
290d0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 49  WC->pMaskSet, pI
290e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
290f0 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 6a     if( (pItem->j
29100 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
29110 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
29120 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61   ){.      mExtra
29130 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
29140 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
29150 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
29160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
29170 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
29180 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  l(pBuilder, mExt
29190 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ra);.    }else{.
291a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
291b0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
291c0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
291d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
291e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
291f0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
29200 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
29210 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
29220 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
29230 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
29240 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
29250 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29260 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 77 68 65 72   break;.  }.wher
29270 65 4c 6f 6f 70 41 64 64 41 6c 6c 5f 65 6e 64 3a  eLoopAddAll_end:
29280 0a 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  .  whereLoopDele
29290 74 65 28 64 62 2c 20 70 42 75 69 6c 64 65 72 2d  te(db, pBuilder-
292a0 3e 70 4e 65 77 29 3b 0a 20 20 70 42 75 69 6c 64  >pNew);.  pBuild
292b0 65 72 2d 3e 70 4e 65 77 20 3d 20 30 3b 0a 20 20  er->pNew = 0;.  
292c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
292d0 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
292e0 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
292f0 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
29300 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
29310 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20  p of the 5th.** 
29320 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
29330 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
29340 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
29350 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
29360 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
29370 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
29380 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
29390 75 72 63 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  urce operation. 
293a0 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20   Return:.** .** 
293b0 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20     0:  ORDER BY 
293c0 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
293d0 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69  .  Sorting requi
293e0 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52  red.**    1:  OR
293f0 44 45 52 20 42 59 20 69 73 20 73 61 74 69 73 66  DER BY is satisf
29400 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73  ied.      Omit s
29410 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20  orting.**   -1: 
29420 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73   Unknown at this
29430 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74   time.**.*/.stat
29440 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
29450 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
29460 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
29470 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
29480 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
29490 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
294a0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
294b0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
294c0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ck */.  int nLoo
294d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
294e0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
294f0 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
29500 6f 70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 73  op[] */.  int is
29510 4c 61 73 74 4c 6f 6f 70 2c 20 20 20 20 20 20 20  LastLoop,       
29520 2f 2a 20 54 72 75 65 20 69 66 20 70 4c 61 73 74  /* True if pLast
29530 20 69 73 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   is the inner-mo
29540 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  st loop */.  Whe
29550 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
29560 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
29570 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
29580 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
29590 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
295a0 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
295b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72   /* Mask of Wher
295c0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
295d0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
295e0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
295f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29600 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
29610 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
29620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29630 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
29640 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
29650 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
29660 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
29670 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
29680 73 57 65 6c 6c 4f 72 64 65 72 65 64 3b 20 20 20  sWellOrdered;   
29690 20 20 2f 2a 20 41 6c 6c 20 57 68 65 72 65 4c 6f    /* All WhereLo
296a0 6f 70 73 20 61 72 65 20 77 65 6c 6c 2d 6f 72 64  ops are well-ord
296b0 65 72 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ered so far */. 
296c0 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
296d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
296e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   of columns in p
296f0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
29700 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
29710 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
29720 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
29730 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
29740 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
29750 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
29760 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
29770 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
29780 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
297b0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
297c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
297d0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
297e0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
297f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
29800 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
29810 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
29820 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
29830 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
29840 70 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20 43 75  pLoop;     /* Cu
29850 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
29860 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
29870 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29880 70 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  pOrderBy = pWInf
29890 6f 2d 3e 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  o->pOrderBy;  /*
298a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
298b0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
298c0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
298d0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
298e0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
298f0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
29900 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
29910 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
29920 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
29930 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
29940 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
29950 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
29960 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
29970 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29980 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
29990 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
299a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
299b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
299c0 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
299d0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
299e0 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
299f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
29a00 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
29a10 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
29a20 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
29a30 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
29a40 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
29a50 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
29a60 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
29a70 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
29a80 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
29a90 72 64 65 72 65 64 4d 61 73 6b 3b 20 20 2f 2a 20  rderedMask;  /* 
29aa0 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
29ab0 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
29ac0 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
29ad0 20 2a 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 57   *pMaskSet; /* W
29ae0 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
29af0 63 74 20 66 6f 72 20 74 68 69 73 20 77 68 65 72  ct for this wher
29b00 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a 0a  e clause */.  ..
29b10 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
29b20 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
29b30 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
29b40 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
29b50 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
29b60 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
29b70 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
29b80 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
29b90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
29ba0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
29bb0 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
29bc0 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
29bd0 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
29be0 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
29bf0 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
29c00 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
29c10 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
29c20 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
29c30 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
29c40 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
29c50 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
29c60 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
29c70 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
29c80 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
29c90 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
29ca0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
29cb0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 77   WhereLoop is "w
29cc0 65 6c 6c 2d 6f 72 64 65 72 65 64 22 20 69 66 0a  ell-ordered" if.
29cd0 20 20 2a 2a 20 20 28 69 29 20 20 69 74 20 73 61    **  (i)  it sa
29ce0 74 69 73 66 69 65 73 20 61 74 20 6c 65 61 73 74  tisfies at least
29cf0 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 74 68 65   one term of the
29d00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29d10 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 28 69 69 29  , and.  **  (ii)
29d20 20 65 76 65 72 79 20 72 6f 77 20 6f 75 74 70 75   every row outpu
29d30 74 20 69 73 20 64 69 73 74 69 6e 63 74 20 6f 76  t is distinct ov
29d40 65 72 20 74 68 65 20 74 65 72 6d 73 20 74 68 61  er the terms tha
29d50 74 20 6d 61 74 63 68 20 74 68 65 0a 20 20 2a 2a  t match the.  **
29d60 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20         ORDER BY 
29d70 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 45 76 65  clause..  ** Eve
29d80 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
29d90 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
29da0 63 61 6c 6c 79 20 77 65 6c 6c 2d 6f 72 64 65 72  cally well-order
29db0 65 64 2c 20 65 76 65 6e 20 69 66 20 69 74 0a 20  ed, even if it. 
29dc0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
29dd0 63 68 20 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  ch any terms of 
29de0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
29df0 75 73 65 2e 0a 20 20 2a 2a 20 46 6f 72 20 63 6f  use..  ** For co
29e00 6e 64 69 74 69 6f 6e 20 28 69 69 29 2c 20 62 65  ndition (ii), be
29e10 20 6d 69 6e 64 66 75 6c 20 74 68 61 74 20 61 20   mindful that a 
29e20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 63 61  UNIQUE column ca
29e30 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a  n have multiple.
29e40 20 20 2a 2a 20 72 6f 77 73 20 74 68 61 74 20 61    ** rows that a
29e50 72 65 20 4e 55 4c 4c 20 61 6e 64 20 73 6f 20 69  re NULL and so i
29e60 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  t not necessaril
29e70 79 20 64 69 73 74 69 6e 63 74 2e 20 20 54 68 65  y distinct.  The
29e80 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6d 75 73   column.  ** mus
29e90 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
29ea0 4e 4f 54 20 4e 55 4c 4c 2e 20 69 6e 20 6f 72 64  NOT NULL. in ord
29eb0 65 72 20 74 6f 20 62 65 20 77 65 6c 6c 2d 6f 72  er to be well-or
29ec0 64 65 72 65 64 2e 0a 20 20 2a 2f 0a 0a 20 20 61  dered..  */..  a
29ed0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
29ee0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
29ef0 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
29f00 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
29f10 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
29f20 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
29f30 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
29f40 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
29f50 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
29f60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29f70 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
29f80 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
29f90 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54  nLoop>0 );  /* T
29fa0 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c  rue when outer l
29fb0 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77  oops are one-row
29fc0 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20   and match .    
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45        ** no ORDE
29ff0 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2a000 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e    return pLast->
2a010 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2a020 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
2a030 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2a040 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2a050 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2a060 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2a070 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2a080 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2a090 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 36    if( nOrderBy>6
2a0a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2a0b0 69 73 57 65 6c 6c 4f 72 64 65 72 65 64 20 3d 20  isWellOrdered = 
2a0c0 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
2a0d0 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
2a0e0 31 3b 0a 20 20 6f 72 64 65 72 65 64 4d 61 73 6b  1;.  orderedMask
2a0f0 20 3d 20 30 3b 0a 20 20 70 4d 61 73 6b 53 65 74   = 0;.  pMaskSet
2a100 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 2d 3e   = pWInfo->pWC->
2a110 70 4d 61 73 6b 53 65 74 3b 0a 20 20 66 6f 72 28  pMaskSet;.  for(
2a120 69 4c 6f 6f 70 3d 30 3b 20 69 73 57 65 6c 6c 4f  iLoop=0; isWellO
2a130 72 64 65 72 65 64 20 26 26 20 6f 62 53 61 74 3c  rdered && obSat<
2a140 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2a150 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2a160 7b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  {.    pLoop = iL
2a170 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2a180 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2a190 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73  : pLast;.    ass
2a1a0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2a1b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2a1c0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2a1d0 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
2a1e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2a1f0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
2a200 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
2a210 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a220 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2a230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2a240 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2a250 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
2a260 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
2a270 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2a280 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2a290 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2a2a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2a2b0 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2a2c0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2a2d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2a2e0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2a2f0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2a300 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2a310 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  mn;.      }..   
2a320 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20     /* For every 
2a330 74 65 72 6d 20 6f 66 20 74 68 65 20 69 6e 64 65  term of the inde
2a340 78 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  x that is constr
2a350 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2a360 53 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2a 20  S NULL.      ** 
2a370 6d 61 72 6b 20 6f 66 66 20 63 6f 72 72 65 73 70  mark off corresp
2a380 6f 6e 64 69 6e 67 20 4f 52 44 45 52 20 42 59 20  onding ORDER BY 
2a390 74 65 72 6d 73 20 77 68 65 72 65 76 65 72 20 74  terms wherever t
2a3a0 68 65 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  hey occur.      
2a3b0 2a 2a 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ** in the ORDER 
2a3c0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
2a3d0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
2a3e0 30 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  0; i<pLoop->u.bt
2a3f0 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ree.nEq; i++){. 
2a400 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70         pTerm = p
2a410 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a  Loop->aTerm[i];.
2a420 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2a430 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2a440 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
2a450 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
2a460 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  ;.        iColum
2a470 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
2a480 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
2a490 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72 64   for(j=0; j<nOrd
2a4a0 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  erBy; j++){.    
2a4b0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2a4c0 54 28 6a 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(j) & obSat ) c
2a4d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a4e0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2a4f0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2a500 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2a510 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
2a520 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2a530 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2a540 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a550 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2a560 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2a570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a580 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2a590 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
2a5a0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
2a5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2a5c0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2a5d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2a5e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2a5f0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2a600 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  e, pOrderBy->a[j
2a610 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2a620 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2a630 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2a640 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2a650 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a660 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
2a670 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
2a680 7a 43 6f 6c 6c 5b 69 5d 29 21 3d 30 20 29 20 63  zColl[i])!=0 ) c
2a690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2a6b0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2a6c0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
2a6d0 20 20 20 20 20 20 69 66 28 20 6f 62 53 61 74 3d        if( obSat=
2a6e0 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
2a6f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
2a700 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
2a710 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
2a720 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2a730 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
2a740 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
2a750 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
2a760 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
2a770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a780 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
2a790 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
2a7a0 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  ; j<=nColumn; j+
2a7b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
2a7c0 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  Once;   /* True 
2a7d0 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
2a7e0 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
2a7f0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
2a800 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2a810 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2a820 20 28 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a   (pLoop->aTerm[j
2a830 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  ]->eOperator & (
2a840 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2a850 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2a860 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2a870 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 3d 3d 20  ue;  /* Skip == 
2a880 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
2a890 73 20 61 6c 72 65 61 64 79 20 70 72 6f 63 65 73  s already proces
2a8a0 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sed */.        }
2a8b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2a8c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2a8d0 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2a8e0 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 20 66  and sort order f
2a8f0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  or the.        *
2a900 2a 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  * j-th column of
2a910 20 74 68 65 20 69 6e 64 65 78 20 66 6f 72 20 74   the index for t
2a920 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 0a 20 20  his WhereLoop.  
2a930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a940 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29   if( j<nColumn )
2a950 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
2a960 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ormal index colu
2a970 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
2a980 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
2a990 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
2a9a0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2a9b0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2a9c0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2a9d0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
2a9e0 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2a9f0 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
2aa00 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
2aa10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2aa20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f 6c  /* The ROWID col
2aa30 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20 2a  umn at the end *
2aa40 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  /.          iCol
2aa50 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2aa60 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
2aa70 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2aa80 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
2aa90 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
2aaa0 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
2aab0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
2aac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
2aad0 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
2aae0 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20 20  l-ordered .     
2aaf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ab00 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ( iColumn>=0.   
2ab10 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
2ab20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
2ab30 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
2ab40 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2ab50 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
2ab60 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
2ab70 20 20 20 20 20 20 20 20 20 69 73 57 65 6c 6c 4f           isWellO
2ab80 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20  rdered = 0;.    
2ab90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2aba0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
2abb0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
2abc0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2abd0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
2abe0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
2abf0 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72  ndex and and mar
2ac00 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
2ac10 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
2ac20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
2ac30 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
2ac40 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2ac50 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2ac60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2ac70 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2ac80 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2ac90 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2aca0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2acb0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2acc0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2acd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ace0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2acf0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2ad00 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2ad10 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2ad20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2ad30 4f 55 50 42 59 29 3d 3d 30 20 29 20 62 4f 6e 63  OUPBY)==0 ) bOnc
2ad40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2ad50 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
2ad60 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
2ad70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2ad80 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
2ad90 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
2ada0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2adb0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2adc0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2add0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2ade0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2adf0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2ae00 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ae10 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2ae20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2ae30 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2ae40 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2ae50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2ae60 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
2ae70 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
2ae80 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
2ae90 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2aea0 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20            bOnce 
2aeb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2aec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2aed0 20 20 20 20 20 20 20 20 69 66 28 20 62 4f 6e 63          if( bOnc
2aee0 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 20  e && i<nOrderBy 
2aef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2af00 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 69 73 57   iColumn<0 ) isW
2af10 65 6c 6c 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a  ellOrdered = 1;.
2af20 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2af30 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2af40 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
2af50 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2af60 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2af70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2af80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
2af90 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
2afa0 61 75 73 65 2c 20 77 65 20 6d 75 73 74 20 6d 61  ause, we must ma
2afb0 74 63 68 20 74 68 65 20 6e 65 78 74 20 61 76 61  tch the next ava
2afc0 69 6c 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ilable.         
2afd0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20     ** column of 
2afe0 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b000 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
2b010 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
2b020 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
2b030 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2b040 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rder ) return 0;
2b050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2b060 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b070 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
2b080 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2b090 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
2b0a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
2b0b0 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
2b0c0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b0e0 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
2b0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b100 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2b110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2b120 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
2b130 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2b140 6a 3c 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 49 6e  j<nColumn || pIn
2b150 64 65 78 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  dex==0 || pIndex
2b160 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
2b170 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ne ){.          
2b180 20 20 69 73 57 65 6c 6c 4f 72 64 65 72 65 64 20    isWellOrdered 
2b190 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2b1a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2b1b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b1c0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
2b1d0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
2b1e0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 20  olumns */.    } 
2b1f0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
2b200 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
2b210 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
2b220 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
2b230 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
2b240 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
2b250 66 28 20 69 73 57 65 6c 6c 4f 72 64 65 72 65 64  f( isWellOrdered
2b260 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 65   ){.      ordere
2b270 64 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  dMask |= pLoop->
2b280 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2b290 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
2b2a0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2b2b0 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
2b2c0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2b2d0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2b2e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
2b2f0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
2b300 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2b310 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
2b320 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2b330 29 26 7e 6f 72 64 65 72 65 64 4d 61 73 6b 29 3d  )&~orderedMask)=
2b340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b350 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2b360 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
2b370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b380 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
2b390 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Done ) return 1;
2b3a0 0a 20 20 69 66 28 20 21 69 73 57 65 6c 6c 4f 72  .  if( !isWellOr
2b3b0 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30  dered ) return 0
2b3c0 3b 0a 20 20 69 66 28 20 69 73 4c 61 73 74 4c 6f  ;.  if( isLastLo
2b3d0 6f 70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  op ) return 1;. 
2b3e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23   return -1;.}..#
2b3f0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2b400 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
2b410 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2b420 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
2b430 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
2b440 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
2b450 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
2b460 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
2b470 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
2b480 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
2b490 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2b4a0 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
2b4b0 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
2b4c0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
2b4d0 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
2b4e0 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
2b4f0 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
2b500 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
2b510 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2b520 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
2b530 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
2b540 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2b550 74 73 20 6f 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts on pWInfo->pL
2b560 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
2b570 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
2b580 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
2b590 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
2b5a0 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
2b5b0 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
2b5c0 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
2b5d0 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
2b5e0 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
2b5f0 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
2b600 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2b610 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
2b620 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
2b630 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
2b640 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
2b650 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
2b660 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
2b670 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
2b680 2a 70 57 49 6e 66 6f 2c 20 64 6f 75 62 6c 65 20  *pWInfo, double 
2b690 6e 52 6f 77 45 73 74 29 7b 0a 20 20 63 6f 6e 73  nRowEst){.  cons
2b6a0 74 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 20 3d  t int mxChoice =
2b6b0 20 31 30 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d   10;  /* Maximum
2b6c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
2b6d0 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
2b6e0 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
2b6f0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
2b700 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b710 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
2b720 6f 69 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oin */.  sqlite3
2b730 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2b740 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2b750 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2b760 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b780 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
2b790 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
2b7a0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
2b7b0 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
2b7c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2b7d0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 64 6f 75  ounters */.  dou
2b7e0 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20  ble rCost;      
2b7f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
2b800 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 64 6f  f a path */.  do
2b810 75 62 6c 65 20 6d 78 43 6f 73 74 3b 20 20 20 20  uble mxCost;    
2b820 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2b830 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
2b840 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 64   of paths */.  d
2b850 6f 75 62 6c 65 20 72 53 6f 72 74 43 6f 73 74 3b  ouble rSortCost;
2b860 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
2b870 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f   to do a sort */
2b880 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
2b890 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
2b8a0 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
2b8b0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
2b8c0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
2b8d0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
2b8e0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
2b8f0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
2b900 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
2b910 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
2b920 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
2b930 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
2b940 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
2b950 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
2b960 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2b970 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
2b980 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
2b990 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
2b9a0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2b9b0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
2b9c0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
2b9d0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
2b9e0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
2b9f0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
2ba00 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
2ba10 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
2ba20 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2ba30 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
2ba40 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
2ba50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2ba60 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
2ba70 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
2ba80 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2baa0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
2bab0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
2bac0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 64 62 20 3d  utine */..  db =
2bad0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2bae0 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
2baf0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2bb00 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
2bb10 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2bb20 2d 3e 6e 53 72 63 20 29 3b 0a 23 69 66 64 65 66  ->nSrc );.#ifdef
2bb30 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2bb40 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2bb50 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
2bb60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bb70 6e 74 66 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  ntf("---- begin 
2bb80 73 6f 6c 76 65 72 5c 6e 22 29 3b 0a 23 65 6e 64  solver\n");.#end
2bb90 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  if..  /* Allocat
2bba0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2bbb0 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61   space for aTo a
2bbc0 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69  nd aFrom */.  ii
2bbd0 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
2bbe0 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
2bbf0 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
2bc00 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53  mxChoice*2;.  pS
2bc10 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
2bc20 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69  MallocRaw(db, ii
2bc30 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
2bc40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2bc50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
2bc60 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
2bc70 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
2bc80 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
2bc90 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
2bca0 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
2bcb0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
2bcc0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
2bcd0 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
2bce0 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ii=0, pFrom=aTo;
2bcf0 20 69 69 3c 6d 78 43 68 6f 69 63 65 2a 32 3b 20   ii<mxChoice*2; 
2bd00 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii++, pFrom++, p
2bd10 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
2bd20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
2bd30 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  pX;.  }..  /* Se
2bd40 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
2bd50 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
2bd60 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
2bd70 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
2bd80 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
2bd90 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Row = (double)1;
2bda0 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20  .  nFrom = 1;.. 
2bdb0 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74   /* Precompute t
2bdc0 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
2bdd0 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
2bde0 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20  ult set, if the 
2bdf0 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73  caller.  ** to s
2be00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2be10 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64  () was concerned
2be20 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a   about sorting *
2be30 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  /.  rSortCost = 
2be40 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 69 66 28  (double)0;.  if(
2be50 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2be60 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3c  y==0 || nRowEst<
2be70 3d 30 2e 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  =0.0 ){.    aFro
2be80 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
2be90 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
2bea0 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  {.    /* Compute
2beb0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20   an estimate on 
2bec0 74 68 65 20 63 6f 73 74 20 74 6f 20 73 6f 72 74  the cost to sort
2bed0 20 74 68 65 20 65 6e 74 69 72 65 20 72 65 73 75   the entire resu
2bee0 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 72 53  lt set */.    rS
2bef0 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73  ortCost = nRowEs
2bf00 74 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  t*estLog(nRowEst
2bf10 29 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  );.#ifdef WHERET
2bf20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2bf30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2bf40 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20  eTrace>=2 ){.   
2bf50 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2bf60 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 73 6f 72 74  rintf("---- sort
2bf70 20 63 6f 73 74 3d 25 2d 37 2e 32 67 5c 6e 22 2c   cost=%-7.2g\n",
2bf80 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20   rSortCost);.   
2bf90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
2bfa0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63   /* Compute succ
2bfb0 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20  essively longer 
2bfc0 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67  WherePaths using
2bfd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65   the previous ge
2bfe0 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66  neration.  ** of
2bff0 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74   WherePaths as t
2c000 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65  he basis for the
2c010 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61   next.  Keep tra
2c020 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ck of the mxChoi
2c030 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74  ce.  ** best pat
2c040 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72  hs at each gener
2c050 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69  ation */.  for(i
2c060 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
2c070 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2c080 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20     nTo = 0;.    
2c090 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
2c0a0 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b  aFrom; ii<nFrom;
2c0b0 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b   ii++, pFrom++){
2c0c0 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f  .      for(pWLoo
2c0d0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
2c0e0 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70  ; pWLoop; pWLoop
2c0f0 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f  =pWLoop->pNextLo
2c100 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  op){.        Bit
2c110 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20  mask maskNew;.  
2c120 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
2c130 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
2c140 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 56     u8 isOrderedV
2c150 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  alid = pFrom->is
2c160 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20  OrderedValid;.  
2c170 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
2c180 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
2c190 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69  dered;.        i
2c1a0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
2c1b0 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
2c1c0 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
2c1d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2c1e0 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
2c1f0 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
2c200 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
2c210 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  inue;.        /*
2c220 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2c230 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64  pWLoop is a cand
2c240 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20  idate to be the 
2c250 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20  next loop. .    
2c260 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69      ** Compute i
2c270 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20  ts cost */.     
2c280 20 20 20 72 43 6f 73 74 20 3d 20 70 57 4c 6f 6f     rCost = pWLoo
2c290 70 2d 3e 72 53 65 74 75 70 20 2b 20 70 57 4c 6f  p->rSetup + pWLo
2c2a0 6f 70 2d 3e 72 52 75 6e 2a 70 46 72 6f 6d 2d 3e  op->rRun*pFrom->
2c2b0 6e 52 6f 77 20 2b 20 70 46 72 6f 6d 2d 3e 72 43  nRow + pFrom->rC
2c2c0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ost;.        mas
2c2d0 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
2c2e0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
2c2f0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2c300 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 65     if( !isOrdere
2c310 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
2c320 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65 72      switch( wher
2c330 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
2c340 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 46  derBy(pWInfo, pF
2c350 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 69 4c 6f 6f  rom, iLoop, iLoo
2c360 70 3d 3d 6e 4c 6f 6f 70 2d 31 2c 0a 20 20 20 20  p==nLoop-1,.    
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c390 20 20 20 20 20 20 20 20 70 57 4c 6f 6f 70 2c 20          pWLoop, 
2c3a0 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20  &revMask) ){.   
2c3b0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a           case 1:
2c3c0 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d    /* Yes.  pFrom
2c3d0 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74  +pWLoop does sat
2c3e0 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
2c3f0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2c400 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2c410 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  red = 1;.       
2c420 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2c430 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
2c440 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c450 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2c460 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72   0:  /* No.  pFr
2c470 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72  om+pWLoop will r
2c480 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74  equire a separat
2c490 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20  e sort */.      
2c4a0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2c4b0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
2c4c0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2c4d0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
2c4e0 20 20 20 20 20 20 20 72 43 6f 73 74 20 2b 3d 20         rCost += 
2c4f0 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20 20  rSortCost;.     
2c500 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c510 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
2c520 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74  ult: /* Cannot t
2c530 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61 67  ell yet.  Try ag
2c540 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ain on the next 
2c550 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
2c560 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2c570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c580 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c590 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
2c5a0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
2c5b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c5c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2c5d0 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
2c5e0 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
2c5f0 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73  the mxChoice bes
2c600 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
2c610 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
2c620 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
2c630 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
2c640 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2c650 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
2c660 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65  w && pTo->isOrde
2c670 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65  redValid==isOrde
2c680 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  redValid ){.    
2c690 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c6a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c6c0 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
2c6d0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
2c6e0 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74  xChoice && rCost
2c6f0 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64  >=mxCost ){.#ifd
2c700 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2c710 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
2c720 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2c730 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c750 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2c760 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
2c770 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c  %-7.2g order=%c\
2c780 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2c790 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2c7a0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
2c7b0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
2c7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c7d0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
2c7e0 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
2c7f0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2c800 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
2c810 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2c820 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2c830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c840 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e        /* Add a n
2c850 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61  ew Path to the a
2c860 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20  To[] set */.    
2c870 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
2c880 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
2c890 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
2c8a0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2c8b0 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
2c8c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c8d0 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
2c8e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2c900 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
2c910 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
2c920 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
2c930 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
2c940 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
2c950 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d 2e  =nTo-1; aTo[jj].
2c960 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a 6a  rCost<mxCost; jj
2c970 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e 30  --){ assert(jj>0
2c980 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d  ); }.          }
2c990 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
2c9a0 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
2c9b0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2c9c0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69  BLED.          i
2c9d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2c9e0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
2c9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2ca00 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
2ca10 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32     %s cost=%-7.2
2ca20 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  g order=%c\n",. 
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2ca40 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2ca50 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2ca60 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
2ca70 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2ca80 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2ca90 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2caa0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2cab0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2cac0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2cad0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2cae0 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b  >rCost<=rCost ){
2caf0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2cb00 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2cb10 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2cb20 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
2cb30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cb40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2cb50 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
2cb60 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
2cb70 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f  %s cost=%-7.2g o
2cb80 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2cba0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2cbb0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2cbc0 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
2cbd0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2cbe0 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
2cbf0 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2cc00 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2cc10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cc20 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
2cc30 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32  vs %s cost=%-7.2
2cc40 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  g order=%c\n",. 
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2cc70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
2cc80 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cca0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2ccb0 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
2ccc0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2ccd0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2cce0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2ccf0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2cd00 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2cd10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2cd20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20 73  new and better s
2cd30 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76 69  core for a previ
2cd40 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65 71  ously created eq
2cd50 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f  uivalent path */
2cd60 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2cd70 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2cd80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2cd90 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
2cda0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2cdb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2cdc0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2cdd0 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73    "Update %s cos
2cde0 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25  t=%-7.2g order=%
2cdf0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
2ce00 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2ce10 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2ce20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2ce50 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
2ce60 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2ce70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ce80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2ce90 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
2cea0 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e  -7.2g order=%c\n
2ceb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2cec0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2ced0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
2cee0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20  ), pTo->rCost,. 
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cf00 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2cf10 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
2cf20 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2cf30 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2cf40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2cf50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2cf60 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
2cf70 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
2cf80 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
2cf90 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
2cfa0 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
2cfb0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
2cfc0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
2cfd0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
2cfe0 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
2cff0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
2d000 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d  To->nRow = pFrom
2d010 2d 3e 6e 52 6f 77 20 2a 20 70 57 4c 6f 6f 70 2d  ->nRow * pWLoop-
2d020 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  >nOut;.        p
2d030 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
2d040 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
2d050 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2d060 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
2d070 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
2d080 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
2d090 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
2d0a0 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
2d0b0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
2d0c0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
2d0d0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
2d0e0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
2d0f0 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
2d100 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
2d110 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
2d120 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
2d130 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
2d140 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
2d150 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
2d160 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
2d170 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
2d180 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
2d190 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73  t>mxCost ) mxCos
2d1a0 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
2d1b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d1d0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
2d1e0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2d1f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2d200 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
2d210 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2d220 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
2d230 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
2d240 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
2d250 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
2d260 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
2d270 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
2d280 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2d290 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
2d2a0 74 3d 25 2d 37 2e 32 67 20 6e 72 6f 77 3d 25 2d  t=%-7.2g nrow=%-
2d2b0 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c 0a  7.2g order=%c",.
2d2c0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2d2d0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2d2e0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2d2f0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2d300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
2d310 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2d320 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
2d330 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2d340 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2d350 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
2d360 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
2d370 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
2d380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2d390 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
2d3a0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
2d3b0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
2d3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d3d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2d3e0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
2d3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d400 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2d410 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
2d420 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
2d430 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
2d440 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
2d450 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
2d460 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
2d470 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
2d480 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
2d490 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
2d4a0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
2d4b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d4c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2d4d0 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
2d4e0 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
2d4f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
2d500 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ce);.    return 
2d510 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2d520 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74  }.  .  /* Find t
2d530 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
2d540 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c  ath.  pFrom will
2d550 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
2d560 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a  g to that path *
2d570 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f  /.  pFrom = aFro
2d580 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  m;.  for(ii=1; i
2d590 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
2d5a0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
2d5b0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
2d5c0 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
2d5d0 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20  aFrom[ii];.  }. 
2d5e0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2d5f0 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
2d600 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
2d610 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
2d620 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
2d630 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
2d640 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
2d650 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
2d660 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
2d670 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
2d680 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
2d690 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
2d6a0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
2d6b0 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
2d6c0 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
2d6d0 3e 69 54 61 62 3b 20 2f 2a 20 46 49 58 4d 45 3a  >iTab; /* FIXME:
2d6e0 20 4f 6d 69 74 20 74 68 65 20 69 46 72 6f 6d 20   Omit the iFrom 
2d6f0 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 70 4c 65  field */.    pLe
2d700 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
2d710 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2d720 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2d730 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
2d740 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
2d750 64 65 72 65 64 20 29 7b 0a 20 20 20 20 70 57 49  dered ){.    pWI
2d760 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 57  nfo->nOBSat = pW
2d770 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
2d780 6e 45 78 70 72 3b 0a 20 20 20 20 70 57 49 6e 66  nExpr;.    pWInf
2d790 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
2d7a0 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 7d  om->revLoop;.  }
2d7b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
2d7c0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
2d7d0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
2d7e0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
2d7f0 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
2d800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
2d810 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
2d820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d830 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
2d840 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
2d850 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
2d860 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
2d870 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2d880 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
2d890 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
2d8a0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
2d8b0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d8c0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
2d8d0 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
2d8e0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2d8f0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
2d900 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2d910 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
2d920 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
2d930 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
2d940 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2d950 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
2d960 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
2d970 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
2d980 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2d990 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2d9a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
2d9b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2d9c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
2d9d0 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
2d9e0 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
2d9f0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
2da00 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
2da10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2da20 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
2da30 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2da40 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
2da50 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2da60 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
2da70 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2da80 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2da90 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
2daa0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
2dab0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
2dac0 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
2dad0 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
2dae0 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
2daf0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
2db00 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
2db10 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
2db20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2db30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2db40 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
2db50 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2db60 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2db70 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2db80 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
2db90 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2dba0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
2dbb0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2dbc0 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
2dbd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
2dbe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2dc10 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2dc20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
2dc40 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2dc50 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
2dc60 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2dc70 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
2dc80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2dc90 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
2dca0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
2dcb0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
2dcc0 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
2dcd0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2dce0 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
2dcf0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
2dd00 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
2dd10 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
2dd20 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
2dd30 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
2dd40 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
2dd50 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2dd60 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
2dd70 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
2dd80 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
2dd90 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
2dda0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
2ddb0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
2ddc0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
2ddd0 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
2dde0 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
2ddf0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2de00 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
2de10 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
2de20 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
2de30 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2de40 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
2de50 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
2de60 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
2de70 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
2de80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2de90 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
2dea0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
2deb0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
2dec0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2ded0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
2dee0 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
2def0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
2df00 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
2df10 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
2df20 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
2df30 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
2df40 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
2df50 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
2df60 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
2df70 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
2df80 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
2df90 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
2dfa0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
2dfb0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
2dfc0 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
2dfd0 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
2dfe0 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
2dff0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
2e000 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e010 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
2e020 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
2e030 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
2e040 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
2e050 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
2e060 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
2e070 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
2e080 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
2e090 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
2e0a0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
2e0b0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
2e0c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2e0d0 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
2e0e0 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
2e0f0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
2e100 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
2e110 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
2e120 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
2e130 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
2e140 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
2e150 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
2e160 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
2e170 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
2e180 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
2e190 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
2e1a0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
2e1b0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
2e1c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
2e1d0 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
2e1e0 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
2e1f0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
2e200 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
2e210 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
2e220 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
2e230 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
2e240 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
2e250 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2e260 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
2e270 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
2e280 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
2e290 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
2e2a0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
2e2b0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
2e2c0 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
2e2d0 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
2e2e0 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
2e2f0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
2e300 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
2e310 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
2e320 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
2e330 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
2e340 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
2e350 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
2e360 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
2e370 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
2e380 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
2e390 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
2e3a0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
2e3b0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
2e3c0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
2e3d0 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
2e3e0 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
2e3f0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2e400 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
2e410 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
2e420 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
2e430 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
2e440 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
2e450 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
2e460 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
2e470 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
2e480 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
2e490 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
2e4a0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
2e4b0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
2e4c0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
2e4d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
2e4e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
2e4f0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
2e500 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
2e510 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
2e520 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
2e530 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2e540 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
2e550 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2e560 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
2e570 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
2e580 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
2e590 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
2e5a0 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
2e5b0 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
2e5c0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
2e5d0 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
2e5e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2e5f0 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
2e600 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
2e610 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65  d.** the returne
2e620 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53  d WhereInfo.nOBS
2e630 61 74 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  at field is set 
2e640 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  to pOrderBy->nEx
2e650 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  pr.  This.** is 
2e660 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2e670 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
2e680 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
2e690 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
2e6a0 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64  set.** if an ind
2e6b0 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
2e6c0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
2e6d0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
2e6e0 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
2e6f0 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
2e700 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
2e710 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
2e720 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
2e730 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
2e740 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66 6f  , then WhereInfo
2e750 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f  .nOBSat is 0..*/
2e760 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
2e770 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
2e780 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2e790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e7a0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2e7b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2e7c0 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
2e7d0 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
2e7e0 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
2e7f0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
2e800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e810 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2e820 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
2e830 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52  erBy,   /* An OR
2e840 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
2e850 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
2e860 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
2e870 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d    /* The select-
2e880 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43  list for DISTINC
2e890 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e  T queries - or N
2e8a0 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
2e8b0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2e8c0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
2e8d0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
2e8e0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
2e8f0 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
2e900 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
2e910 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
2e920 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
2e930 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
2e940 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
2e950 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
2e960 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
2e970 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
2e980 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
2e990 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
2e9a0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
2e9b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e9c0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
2e9d0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
2e9e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2e9f0 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
2ea00 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
2ea10 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
2ea20 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
2ea30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2ea40 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
2ea50 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
2ea60 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
2ea70 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
2ea80 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
2ea90 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
2eaa0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
2eab0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2eac0 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
2ead0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
2eae0 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
2eaf0 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2eb00 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
2eb10 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
2eb20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
2eb30 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
2eb40 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
2eb50 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
2eb60 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
2eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2eb90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2eba0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2ebb0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2ebc0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
2ebd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2ebe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ebf0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a  n code */...  /*
2ec00 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
2ec10 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65  lization */.  me
2ec20 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
2ec30 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20  izeof(sWLB));.  
2ec40 73 57 4c 42 2e 70 50 61 72 73 65 20 3d 20 70 50  sWLB.pParse = pP
2ec50 61 72 73 65 3b 0a 20 20 73 57 4c 42 2e 64 62 20  arse;.  sWLB.db 
2ec60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2ec70 73 57 4c 42 2e 70 54 61 62 4c 69 73 74 20 3d 20  sWLB.pTabList = 
2ec80 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 57 4c 42  pTabList;.  sWLB
2ec90 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
2eca0 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  erBy;..  /* The 
2ecb0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
2ecc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2ecd0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2ece0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
2ecf0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
2ed00 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
2ed10 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
2ed20 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
2ed30 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
2ed40 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
2ed50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ed60 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
2ed70 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
2ed80 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
2ed90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2eda0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2edb0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
2edc0 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
2edd0 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
2ede0 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
2edf0 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
2ee00 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
2ee10 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2ee20 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
2ee30 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
2ee40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2ee50 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
2ee60 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
2ee70 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
2ee80 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
2ee90 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
2eea0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
2eeb0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
2eec0 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
2eed0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
2eee0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2eef0 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
2ef00 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
2ef10 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
2ef20 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
2ef30 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
2ef40 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
2ef50 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
2ef60 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
2ef70 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
2ef80 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2ef90 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
2efa0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
2efb0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
2efc0 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
2efd0 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2efe0 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
2eff0 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
2f000 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
2f010 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
2f020 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
2f030 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
2f040 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
2f050 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
2f060 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
2f070 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
2f080 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
2f090 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
2f0a0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  low..  */.  db =
2f0b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
2f0c0 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
2f0d0 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
2f0e0 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
2f0f0 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
2f100 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
2f110 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2f120 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
2f130 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20   nByteWInfo + . 
2f140 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2f150 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20  eClause) +.     
2f160 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
2f170 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28  kSet).  );.  if(
2f180 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2f190 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
2f1a0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
2f1b0 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
2f1c0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
2f1d0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2f1e0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
2f1f0 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
2f200 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
2f210 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
2f220 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
2f230 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2f240 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
2f250 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
2f260 2d 3e 70 44 69 73 74 69 6e 63 74 20 3d 20 70 44  ->pDistinct = pD
2f270 69 73 74 69 6e 63 74 3b 0a 20 20 70 57 49 6e 66  istinct;.  pWInf
2f280 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
2f290 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2f2a0 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  (v);.  pWInfo->p
2f2b0 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
2f2c0 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
2f2d0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
2f2e0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
2f2f0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
2f300 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
2f310 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
2f320 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2f330 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
2f340 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
2f350 26 70 57 49 6e 66 6f 2d 3e 70 57 43 5b 31 5d 3b  &pWInfo->pWC[1];
2f360 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
2f370 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
2f380 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57  pWC = pWInfo->pW
2f390 43 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  C;..  /* Disable
2f3a0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
2f3b0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
2f3c0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
2f3d0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
2f3e0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
2f3f0 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
2f400 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2f410 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
2f420 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
2f430 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
2f440 69 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44  istinctOpt) ) pD
2f450 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20  istinct = 0;..  
2f460 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
2f470 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
2f480 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
2f490 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
2f4a0 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
2f4b0 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
2f4c0 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
2f4d0 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
2f4e0 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
2f4f0 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
2f500 65 49 6e 69 74 28 70 57 49 6e 66 6f 2d 3e 70 57  eInit(pWInfo->pW
2f510 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C, pParse, pMask
2f520 53 65 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  Set, wctrlFlags)
2f530 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2f540 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
2f550 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
2f560 77 68 65 72 65 53 70 6c 69 74 28 70 57 49 6e 66  whereSplit(pWInf
2f570 6f 2d 3e 70 57 43 2c 20 70 57 68 65 72 65 2c 20  o->pWC, pWhere, 
2f580 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d  TK_AND);   /* IM
2f590 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36  P: R-15842-53296
2f5a0 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
2f5b0 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
2f5c0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2f5d0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
2f5e0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
2f5f0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
2f600 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
2f610 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
2f620 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
2f630 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
2f640 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2f650 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
2f660 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
2f670 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
2f680 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2f690 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
2f6a0 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
2f6b0 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
2f6c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
2f6d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
2f6e0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2f6f0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2f700 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2f710 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2f720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2f730 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
2f740 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
2f750 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
2f760 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
2f770 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
2f780 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
2f790 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
2f7a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2f7b0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
2f7c0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
2f7d0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
2f7e0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2f7f0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
2f800 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
2f810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
2f820 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
2f830 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
2f840 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
2f850 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2f860 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
2f870 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
2f880 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2f890 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
2f8a0 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
2f8b0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
2f8c0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
2f8d0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
2f8e0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
2f8f0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
2f900 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
2f910 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
2f920 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
2f930 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2f940 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2f950 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
2f960 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
2f970 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
2f980 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
2f990 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
2f9a0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
2f9b0 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
2f9c0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
2f9d0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
2f9e0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
2f9f0 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
2fa00 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
2fa10 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
2fa20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
2fa30 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
2fa40 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
2fa50 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
2fa60 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
2fa70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
2fa80 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
2fa90 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
2faa0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2fab0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
2fac0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
2fad0 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
2fae0 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
2faf0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
2fb00 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2fb10 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2fb20 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2fb30 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
2fb40 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2fb50 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
2fb60 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
2fb70 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
2fb80 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
2fb90 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
2fba0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
2fbb0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
2fbc0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
2fbd0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
2fbe0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
2fbf0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
2fc00 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
2fc10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2fc20 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
2fc30 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
2fc40 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
2fc50 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
2fc60 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
2fc70 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
2fc80 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
2fc90 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
2fca0 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
2fcb0 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
2fcc0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
2fcd0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
2fce0 28 70 54 61 62 4c 69 73 74 2c 20 70 57 49 6e 66  (pTabList, pWInf
2fcf0 6f 2d 3e 70 57 43 29 3b 0a 20 20 69 66 28 20 64  o->pWC);.  if( d
2fd00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2fd10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
2fd20 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2fd30 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
2fd40 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
2fd50 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65  lifier, if there
2fd60 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75   is one, is redu
2fd70 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20  ndant. .  ** If 
2fd80 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20  it is, then set 
2fd90 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c  pDistinct to NUL
2fda0 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e  L and WhereInfo.
2fdb0 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a  eDistinct to.  *
2fdc0 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  * WHERE_DISTINCT
2fdd0 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20  _UNIQUE to tell 
2fde0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67  the caller to ig
2fdf0 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43  nore the DISTINC
2fe00 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  T..  */.  if( pD
2fe10 69 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73  istinct && isDis
2fe20 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
2fe30 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2c 70  Parse,pTabList,p
2fe40 57 49 6e 66 6f 2d 3e 70 57 43 2c 70 44 69 73 74  WInfo->pWC,pDist
2fe50 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69  inct) ){.    pDi
2fe60 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2fe70 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2fe80 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2fe90 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a  CT_UNIQUE;.  }..
2fea0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
2feb0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2fec0 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54  ects */.  WHERET
2fed0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
2fee0 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
2fef0 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  "));.  rc = wher
2ff00 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
2ff10 42 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  B);.  if( rc ) g
2ff20 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2ff30 72 6f 72 3b 0a 0a 20 20 2f 2a 20 44 69 73 70 6c  ror;..  /* Displ
2ff40 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
2ff50 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2ff60 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
2ff70 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
2ff80 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2ff90 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2ffa0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
2ffb0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
2ffc0 70 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  p;.    int i = 0
2ffd0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  ;.    static cha
2ffe0 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
2fff0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
30000 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
30010 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30030 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
30040 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
30050 57 59 58 5a 22 3b 0a 20 20 20 20 66 6f 72 28 70  WYXZ";.    for(p
30060 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
30070 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
30080 6f 70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 49  op){.      p->cI
30090 64 20 3d 20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29  d = zLabel[(i++)
300a0 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
300b0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
300c0 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69  pPrint(p, pTabLi
300d0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  st);.    }.  }.#
300e0 65 6e 64 69 66 0a 0a 20 20 77 68 65 72 65 50 61  endif..  wherePa
300f0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
30100 20 2d 31 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e   -1);.  if( db->
30110 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
30120 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
30130 72 6f 72 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  ror;.  if( pWInf
30140 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
30150 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
30160 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
30170 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
30180 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
30190 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
301a0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
301b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
301c0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
301d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
301e0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
301f0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
30200 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
30210 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
30220 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
30230 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
30240 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30250 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
30260 6f 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 57  on");.    if( pW
30270 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 29 7b 0a  Info->nOBSat ){.
30280 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30290 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
302a0 20 42 59 20 6f 6d 69 74 74 65 64 20 72 65 76 3d   BY omitted rev=
302b0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 57 49 6e 66  0x%llx\n", pWInf
302c0 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
302d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
302e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
302f0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
30300 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
30310 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
30320 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
30330 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
30340 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c  i].pWLoop, pTabL
30350 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
30360 23 65 6e 64 69 66 0a 20 20 57 48 45 52 45 54 52  #endif.  WHERETR
30370 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
30380 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
30390 5c 6e 22 29 29 3b 0a 0a 23 69 66 20 30 20 20 2f  \n"));..#if 0  /
303a0 2a 20 46 49 58 4d 45 3a 20 41 64 64 20 74 68 69  * FIXME: Add thi
303b0 73 20 62 61 63 6b 20 69 6e 3f 20 2a 2f 0a 20 20  s back in? */.  
303c0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
303d0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
303e0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
303f0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
30400 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
30410 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
30420 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
30430 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
30440 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
30450 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
30460 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
30470 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
30480 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
30490 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
304a0 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
304b0 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
304c0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
304d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
304e0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
304f0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
30500 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
30510 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
30520 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
30530 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46  RED)!=0 && (andF
30540 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
30550 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
30560 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
30570 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
30580 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[0].plan.wsFl
30590 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
305a0 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 23 65 6e 64  X_ONLY;.  }.#end
305b0 69 66 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c  if..  /* Open al
305c0 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
305d0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
305e0 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
305f0 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
30600 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
30610 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
30620 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
30630 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
30640 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
30650 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
30660 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20  o */.  notReady 
30670 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
30680 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
30690 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
306a0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
306b0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
306c0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
306d0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
306e0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
306f0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
30700 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
30710 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
30720 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
30730 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
30740 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
30750 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30760 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68  pTabItem;.    Wh
30770 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
30780 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
30790 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
307a0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
307b0 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
307c0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
307d0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
307e0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
307f0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
30800 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
30810 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
30820 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
30830 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
30840 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
30850 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
30860 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
30870 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
30880 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
30890 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
308a0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
308b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
308c0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
308d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
308e0 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
308f0 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
30900 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
30910 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
30920 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
30930 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
30940 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
30950 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
30960 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
30970 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
30980 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
30990 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
309a0 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
309b0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
309c0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
309d0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
309e0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
309f0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
30a00 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
30a10 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  CLOSE)==0 ){.   
30a20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
30a30 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
30a40 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
30a50 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
30a60 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
30a70 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
30a80 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
30a90 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
30aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
30ab0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
30ac0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
30ad0 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
30ae0 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
30af0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
30b00 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
30b10 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
30b20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
30b30 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
30b40 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
30b50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
30b60 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
30b70 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
30b80 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
30b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30ba0 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
30bd0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
30be0 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
30bf0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
30c00 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
30c10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
30c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
30c30 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
30c40 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
30c50 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
30c60 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
30c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
30c80 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
30c90 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
30ca0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
30cb0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
30cc0 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
30cd0 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
30ce0 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 57 43 2c 20  e, pWInfo->pWC, 
30cf0 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61  pTabItem, notRea
30d00 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
30d10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
30d20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30d30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
30d40 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
30d50 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
30d60 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
30d70 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
30d80 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
30d90 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
30da0 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
30db0 2f 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e  /* FIXME:  As an
30dc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73   optimization us
30dd0 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  e pTabItem->iCur
30de0 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58  sor if WHERE_IDX
30df0 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69  _ONLY */.      i
30e00 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70  nt iIndexCur = p
30e10 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
30e20 20 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43   iIdxCur ? iIdxC
30e30 75 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur : pParse->nTa
30e40 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
30e50 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
30e60 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
30e70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30e80 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
30e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30ea0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
30eb0 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
30ec0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
30ed0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
30ee0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
30ef0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
30f00 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
30f10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
30f20 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
30f30 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
30f40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
30f50 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
30f60 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
30f70 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
30f80 70 57 49 6e 66 6f 2d 3e 70 57 43 2d 3e 70 4d 61  pWInfo->pWC->pMa
30f90 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
30fa0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >iCursor);.  }. 
30fb0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
30fc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
30fd0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
30fe0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
30ff0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
31000 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
31010 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
31020 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
31030 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
31040 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
31050 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
31060 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
31070 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
31080 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
31090 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
310a0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
310b0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
310c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61  for(ii=0; ii<nTa
310d0 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  bList; ii++){.  
310e0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
310f0 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65  fo->a[ii];.    e
31100 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50  xplainOneScan(pP
31110 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
31120 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
31130 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
31140 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52  Flags);.    notR
31150 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
31160 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
31170 69 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  ii, wctrlFlags, 
31180 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
31190 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
311a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
311b0 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ont;.  }..  /* D
311c0 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  one. */.  return
311d0 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
311e0 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
311f0 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
31200 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
31210 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
31220 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
31230 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
31240 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
31250 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
31260 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
31270 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
31280 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
31290 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
312a0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
312b0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
312c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
312d0 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
312e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
312f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
31300 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
31310 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
31320 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
31330 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
31340 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
31350 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
31360 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
31370 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
31380 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
31390 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
313a0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
313b0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
313c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
313d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
313e0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
313f0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
31400 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
31410 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
31420 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
31430 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
31440 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
31450 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
31460 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
31470 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
31480 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31490 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
314a0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
314b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
314c0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
314d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
314e0 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
314f0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
31500 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
31510 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31520 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
31530 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
31540 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
31550 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
31560 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
31570 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
31580 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
31590 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
315a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
315b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
315c0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
315d0 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
315e0 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
315f0 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
31600 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
31610 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
31620 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
31630 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
31640 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
31650 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
31660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31670 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
31680 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
31690 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
316a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
316b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
316c0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
316d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
316e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
316f0 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
31700 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
31710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
31720 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
31730 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
31740 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
31750 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
31760 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
31770 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
31780 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
31790 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
317a0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
317b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
317c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
317d0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
317e0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
317f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
31800 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
31810 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
31820 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
31830 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
31840 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
31850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31860 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
31870 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
31880 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
31890 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  }.      if( pLoo
318a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
318b0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
318c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
318d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
318e0 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
318f0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
31900 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
31910 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
31920 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
31940 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
31950 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
31960 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
31970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31990 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
319a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
319b0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
319c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
319d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
319e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
319f0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
31a00 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
31a10 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
31a20 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
31a30 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
31a40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
31a50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
31a60 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
31a70 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
31a80 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
31a90 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
31aa0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
31ab0 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  Begin..  */.  as
31ac0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
31ad0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66  evel==1 || pWInf
31ae0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c  o->nLevel==pTabL
31af0 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
31b00 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
31b10 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
31b20 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
31b30 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
31b40 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
31b50 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
31b60 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
31b70 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
31b80 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
31b90 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
31ba0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
31bb0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
31bc0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
31bd0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
31be0 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
31bf0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
31c00 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
31c10 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
31c20 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
31c30 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
31c40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
31c50 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
31c60 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
31c70 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
31c80 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
31c90 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
31ca0 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57  ePass && (ws & W
31cb0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
31cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
31cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31ce0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
31cf0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
31d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31d10 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
31d20 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73  DEXED)!=0 && (ws
31d30 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
31d40 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29  ERE_TEMP_INDEX))
31d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
31d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
31d70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
31d80 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
31d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
31da0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
31db0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
31dc0 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
31dd0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
31de0 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
31df0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
31e00 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
31e10 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
31e20 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
31e30 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
31e40 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
31e50 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
31e60 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
31e70 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
31e80 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
31e90 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
31ea0 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
31eb0 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
31ec0 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
31ed0 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
31ee0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
31ef0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
31f00 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
31f10 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
31f20 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
31f30 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
31f40 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
31f50 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
31f60 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
31f70 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
31f80 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
31f90 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
31fa0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
31fb0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
31fc0 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
31fd0 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
31fe0 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
31ff0 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
32000 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
32010 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
32020 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
32030 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
32040 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
32050 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
32060 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
32070 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
32080 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
32090 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
320a0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
320b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
320c0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
320d0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
320e0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
320f0 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
32100 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
32110 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
32120 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e  f( pIdx && !db->
32130 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
32140 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
32150 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
32160 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
32170 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
32180 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
32190 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
321a0 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
321b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
321c0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
321d0 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
321e0 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
321f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
32200 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
32210 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
32220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
32230 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
32240 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
32250 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
32260 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
32270 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32280 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
32290 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
322b0 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
322c0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
322d0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
322e0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
322f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32310 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
32320 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
32330 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
32340 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49  ONLY)==0 || j<pI
32350 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
32360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
32370 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
32380 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
32390 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
323a0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
323b0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
323c0 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
323d0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
323e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
323f0 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
32400 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
32410 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
32420 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
32430 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
32440 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
32450 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
32460 7d 0a                                            }.