/ Hex Artifact Content
Login

Artifact a60b27296226bc073ae87988f7cec222d9523d7d:


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 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
36b0: 30 78 30 30 30 30 30 30 31 30 20 20 2f 2a 20 78  0x00000010  /* x
36c0: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
36d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
36e0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
36f0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
3700: 30 30 32 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0020  /* x>EXPR 
3710: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
3720: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
3730: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
3740: 54 20 20 20 30 78 30 30 30 30 30 30 33 30 20 20  T   0x00000030  
3750: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
3760: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
3770: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
3780: 4e 4c 59 20 20 20 20 20 30 78 30 30 30 30 30 30  NLY     0x000000
3790: 34 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  40  /* Use index
37a0: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
37b0: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
37c0: 45 52 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20  ERE_IPK         
37d0: 20 30 78 30 30 30 30 30 31 30 30 20 20 2f 2a 20   0x00000100  /* 
37e0: 78 20 69 73 20 74 68 65 20 49 4e 54 45 47 45 52  x is the INTEGER
37f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
3800: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
3810: 44 45 58 45 44 20 20 20 20 20 20 30 78 30 30 30  DEXED      0x000
3820: 30 30 32 30 30 20 20 2f 2a 20 57 68 65 72 65 4c  00200  /* WhereL
3830: 6f 6f 70 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64  oop.u.btree.pInd
3840: 65 78 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23  ex is valid */.#
3850: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52  define WHERE_VIR
3860: 54 55 41 4c 54 41 42 4c 45 20 30 78 30 30 30 30  TUALTABLE 0x0000
3870: 30 34 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f  0400  /* WhereLo
3880: 6f 70 2e 75 2e 76 74 61 62 20 69 73 20 76 61 6c  op.u.vtab is val
3890: 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  id */.#define WH
38a0: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
38b0: 20 30 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20   0x00000800  /* 
38c0: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
38d0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
38e0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
38f0: 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78 30  UNIQUE       0x0
3900: 30 30 30 31 30 30 30 20 20 2f 2a 20 53 65 6c 65  0001000  /* Sele
3910: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
3920: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66   one row */.#def
3930: 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ine WHERE_MULTI_
3940: 4f 52 20 20 20 20 20 30 78 30 30 30 30 32 30 30  OR     0x0000200
3950: 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d  0  /* OR using m
3960: 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20  ultiple indices 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3980: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78  _TEMP_INDEX   0x
3990: 30 30 30 30 34 30 30 30 20 20 2f 2a 20 55 73 65  00004000  /* Use
39a0: 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  s an ephemeral i
39b0: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
39c0: 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
39d0: 20 20 20 30 78 30 30 30 30 38 30 30 30 20 20 2f     0x00008000  /
39e0: 2a 20 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  * Full scan of a
39f0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
3a00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
3a10: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
3a20: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
3a30: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
3a40: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3a50: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
3a60: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
3a80: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
3a90: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
3aa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3ac0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
3ad0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
3ae0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a  t *pMaskSet,  /*
3af0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
3b00: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
3b10: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
3b20: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
3b30: 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
3b40: 4d 69 67 68 74 20 69 6e 63 6c 75 64 65 20 57 48  Might include WH
3b50: 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_AND_ONLY */.
3b60: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
3b70: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
3b80: 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61  ->pMaskSet = pMa
3b90: 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 70 4f  skSet;.  pWC->pO
3ba0: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
3bb0: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
3bc0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
3bd0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
3be0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
3bf0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
3c00: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  WC->wctrlFlags =
3c10: 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a   wctrlFlags;.}..
3c20: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3c30: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
3c40: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
3c50: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
3c60: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
3c70: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
3c80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3c90: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
3ca0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
3cb0: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
3cc0: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3cd0: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
3ce0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
3cf0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
3d00: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3d10: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3d20: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
3d30: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
3d40: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
3d50: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
3d60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
3d70: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
3d80: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
3d90: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
3da0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
3db0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
3dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3dd0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
3de0: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
3df0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
3e00: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3e10: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3e20: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
3e30: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
3e40: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
3e50: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
3e60: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
3e70: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
3e80: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
3e90: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
3ea0: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
3eb0: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
3ec0: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
3ed0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
3ee0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
3ef0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
3f00: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
3f10: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
3f20: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
3f30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3f40: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
3f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3f60: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
3f70: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
3f80: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
3f90: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
3fa0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
3fb0: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3fc0: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
3fd0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
3fe0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
3ff0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
4000: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
4010: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
4020: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
4030: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
4040: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
4050: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
4060: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
4070: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
4080: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
4090: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
40a0: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
40b0: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
40c0: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
40d0: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
40e0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
40f0: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
4100: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
4110: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
4120: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
4130: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
4140: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
4150: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
4160: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
4170: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
4180: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
4190: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
41a0: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
41b0: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
41c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
41d0: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
41e0: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
41f0: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
4200: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4210: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
4220: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4230: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
4240: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
4250: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
4260: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
4270: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
4280: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
4290: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
42a0: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
42b0: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
42c0: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
42d0: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
42e0: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
42f0: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
4300: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
4310: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
4320: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
4330: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
4340: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
4350: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
4360: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
4370: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
4380: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
4390: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
43a0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
43b0: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
43c0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
43d0: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
43e0: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
43f0: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
4400: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
4410: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
4420: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
4430: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
4440: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
4450: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
4460: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
4470: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
4480: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
4490: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
44a0: 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30   );  /* EV: R-00
44b0: 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69  211-15100 */.  i
44c0: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
44d0: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
44e0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
44f0: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
4500: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
4510: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
4520: 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74    pWC->a = sqlit
4530: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4540: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
4550: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
4560: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
4570: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >a==0 ){.      i
4580: 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  f( wtFlags & TER
4590: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
45a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
45b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
45c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43       }.      pWC
45d0: 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20  ->a = pOld;.    
45e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
45f0: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43  }.    memcpy(pWC
4600: 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f  ->a, pOld, sizeo
4610: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
4620: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  ->nTerm);.    if
4630: 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74  ( pOld!=pWC->aSt
4640: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71  atic ){.      sq
4650: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4660: 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pOld);.    }.   
4670: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71   pWC->nSlot = sq
4680: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
4690: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69  e(db, pWC->a)/si
46a0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b  zeof(pWC->a[0]);
46b0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
46c0: 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43  pWC->a[idx = pWC
46d0: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54  ->nTerm++];.  pT
46e0: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  erm->pExpr = sql
46f0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
4700: 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d  ate(p);.  pTerm-
4710: 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61  >wtFlags = wtFla
4720: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
4730: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
4740: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
4750: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
4760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4770: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
4780: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
4790: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
47a0: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
47b0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
47c0: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
47d0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
47e0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
47f0: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
4800: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
4810: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
4820: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
4830: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
4840: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
4850: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
4860: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
4870: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
4880: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
4890: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
48a0: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
48b0: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
48c0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
48d0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
48e0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
48f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
4900: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
4910: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
4920: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
4930: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
4940: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
4950: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
4960: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
4970: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
4980: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
4990: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
49a0: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
49b0: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
49c0: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
49d0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
49e0: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
49f0: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
4a00: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
4a10: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
4a20: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
4a30: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
4a40: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
4a50: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
4a60: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
4a70: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
4a80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c  ic void whereSpl
4a90: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
4aa0: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
4ab0: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43  , int op){.  pWC
4ac0: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
4ad0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
4ae0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
4af0: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
4b00: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
4b10: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
4b20: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
4b30: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
4b40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4b50: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
4b60: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
4b70: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
4b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
4b90: 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69  lize an expressi
4ba0: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57  on mask set (a W
4bb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
4bc0: 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ct).*/.#define i
4bd0: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d  nitMaskSet(P)  m
4be0: 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65  emset(P, 0, size
4bf0: 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52  of(*P))../*.** R
4c00: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
4c10: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
4c20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
4c30: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
4c40: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
4c50: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
4c60: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
4c70: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
4c80: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
4c90: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
4ca0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
4cb0: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
4cc0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
4cd0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
4ce0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
4cf0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
4d00: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
4d10: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
4d20: 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31  turn ((Bitmask)1
4d30: 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )<<i;.    }.  }.
4d40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4d50: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
4d60: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
4d70: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
4d80: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
4d90: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
4da0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
4db0: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
4dc0: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
4dd0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
4de0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
4df0: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
4e00: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
4e10: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
4e20: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
4e30: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
4e40: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
4e50: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
4e60: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
4e70: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
4e80: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4e90: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
4ea0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
4eb0: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
4ec0: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
4ed0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
4ee0: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
4ef0: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
4f00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4f10: 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75  tine walks (recu
4f20: 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72  rsively) an expr
4f30: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
4f40: 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62  generates.** a b
4f50: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
4f60: 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61  g which tables a
4f70: 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20  re used in that 
4f80: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
4f90: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ee..**.** In ord
4fa0: 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  er for this rout
4fb0: 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65  ine to work, the
4fc0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
4fd0: 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70  n must have.** p
4fe0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65  reviously invoke
4ff0: 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  d sqlite3Resolve
5000: 45 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74  ExprNames() on t
5010: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
5020: 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65  See.** the heade
5030: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
5040: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
5050: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
5060: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  tion..** The sql
5070: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
5080: 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20  ames() routines 
5090: 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  looks for column
50a0: 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65   names and.** se
50b0: 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73  ts their opcodes
50c0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
50d0: 64 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61  d their Expr.iTa
50e0: 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a  ble fields to.**
50f0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
5100: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
5110: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
5120: 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a  ine just has to.
5130: 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65  ** translate the
5140: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
5150: 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c  into bitmask val
5160: 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a  ues and OR all.*
5170: 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74  * the bitmasks t
5180: 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  ogether..*/.stat
5190: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
51a0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
51b0: 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70  ereMaskSet*, Exp
51c0: 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
51d0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
51e0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
51f0: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  reMaskSet*, Sele
5200: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
5210: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
5220: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
5230: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
5240: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
5250: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
5260: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5270: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
5280: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
5290: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
52a0: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
52b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
52c0: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
52d0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
52e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
52f0: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
5300: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
5310: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
5320: 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ft);.  if( ExprH
5330: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5340: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5350: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
5360: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
5370: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
5380: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Select);.  }else
5390: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
53a0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
53b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e  (pMaskSet, p->x.
53c0: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pList);.  }.  re
53d0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
53e0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
53f0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57  ListTableUsage(W
5400: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
5410: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
5420: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
5430: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
5440: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
5450: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
5460: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
5470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
5480: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
5490: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
54a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
54b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
54c0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
54d0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
54e0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
54f0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
5500: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
5510: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
5520: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69   mask = 0;.  whi
5530: 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72  le( pS ){.    Sr
5540: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53  cList *pSrc = pS
5550: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b  ->pSrc;.    mask
5560: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
5570: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5580: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
5590: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
55a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
55b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
55c0: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
55d0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
55e0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
55f0: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
5600: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
5610: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5620: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
5630: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
5640: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
5650: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
5660: 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  );.    if( ALWAY
5670: 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20  S(pSrc!=0) ){.  
5680: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5690: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
56a0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
56b0: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
56c0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
56d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72  ge(pMaskSet, pSr
56e0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  c->a[i].pSelect)
56f0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  ;.        mask |
5700: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5710: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d  (pMaskSet, pSrc-
5720: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
5730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
5740: 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20   = pS->pPrior;. 
5750: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
5760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5770: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
5780: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
5790: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
57a0: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
57b0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
57c0: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
57d0: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
57e0: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
57f0: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
5800: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
5810: 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a  >=", and "IN"..*
5820: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
5830: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
5840: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
5850: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
5860: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
5870: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
5880: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
5890: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
58a0: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
58b0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
58c0: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
58d0: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
58e0: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
58f0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
5900: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
5910: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
5920: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
5930: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
5940: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
5950: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
5960: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
5970: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
5980: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
5990: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
59a0: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
59b0: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
59c0: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
59d0: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
59e0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
59f0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
5a00: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
5a10: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
5a20: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
5a30: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
5a40: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
5a50: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
5a60: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
5a70: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
5a80: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
5a90: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
5aa0: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
5ab0: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
5ac0: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
5ad0: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
5ae0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
5af0: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
5b00: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
5b10: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
5b20: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
5b30: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
5b40: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
5b50: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
5b60: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
5b70: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
5b80: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
5b90: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
5ba0: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
5bb0: 69 6e 67 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74  ing.** side of t
5bc0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69  he comparison, i
5bd0: 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69  t remains associ
5be0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 61  ated with the sa
5bf0: 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a  me side after.**
5c00: 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e   the commutation
5c10: 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20  . So "Y collate 
5c20: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
5c30: 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 6f 70 20 59  omes .** "X op Y
5c40: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
5c50: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
5c60: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
5c70: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
5c80: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
5c90: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
5ca0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5cb0: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
5cc0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
5cd0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
5ce0: 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  on the EP_Collat
5cf0: 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74  e flag.** is not
5d00: 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74   commuted..*/.st
5d10: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
5d20: 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61  mmute(Parse *pPa
5d30: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
5d40: 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68  ){.  u16 expRigh
5d50: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67  t = (pExpr->pRig
5d60: 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ht->flags & EP_C
5d70: 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65  ollate);.  u16 e
5d80: 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d  xpLeft = (pExpr-
5d90: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
5da0: 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61  EP_Collate);.  a
5db0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
5dc0: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70  (pExpr->op) && p
5dd0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20  Expr->op!=TK_IN 
5de0: 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67 68  );.  if( expRigh
5df0: 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20  t==expLeft ){.  
5e00: 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e    /* Either X an
5e10: 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f  d Y both have CO
5e20: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f  LLATE operator o
5e30: 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a  r neither do */.
5e40: 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68 74      if( expRight
5e50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74   ){.      /* Bot
5e60: 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20 43  h X and Y have C
5e70: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
5e80: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69  .  Make sure X i
5e90: 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a  s always.      *
5ea0: 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72 69  * used by cleari
5eb0: 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  ng the EP_Collat
5ec0: 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a  e flag from Y. *
5ed0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
5ee0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20  Right->flags &= 
5ef0: 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  ~EP_Collate;.   
5f00: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
5f10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
5f20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
5f30: 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
5f40: 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72  /* Neither X nor
5f50: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
5f60: 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58  operators, but X
5f70: 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75   has a non-defau
5f80: 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c  lt.      ** coll
5f90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
5fa0: 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43   So add the EP_C
5fb0: 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e  ollate marker on
5fc0: 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20   X to cause.    
5fd0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65    ** it to be se
5fe0: 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f  arched first. */
5ff0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
6000: 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  eft->flags |= EP
6010: 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  _Collate;.    }.
6020: 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a    }.  SWAP(Expr*
6030: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
6040: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6050: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
6060: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
6070: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
6080: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
6090: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
60a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
60b0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
60c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
60d0: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
60e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
60f0: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
6100: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
6110: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
6120: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
6130: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
6140: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
6150: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
6160: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
6170: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
6180: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
6190: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
61a0: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
61b0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
61c0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
61d0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
61e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
61f0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
6200: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
6210: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6220: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
6230: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
6240: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
6250: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
6260: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
6270: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
6280: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
6290: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
62a0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
62b0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
62c0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
62d0: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
62e0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
62f0: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
6300: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
6310: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
6320: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
6330: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
6340: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
6350: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
6360: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
6370: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn c;.}../*.** A
6380: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
6390: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
63a0: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
63b0: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
63c0: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
63d0: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
63e0: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
63f0: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
6400: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
6410: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
6420: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
6430: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
6440: 65 72 6d 73 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  erms..*/.WhereTe
6450: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
6460: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
6470: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
6480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6490: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
64a0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
64b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
64c0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
64d0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
64e0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
64f0: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
6500: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
6510: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
6520: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
6530: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
6540: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
6550: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
6560: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
6570: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
6580: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
6590: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
65a0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
65b0: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
65c0: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
65d0: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
65e0: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
65f0: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
6600: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
6610: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
6620: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
6630: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
6640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
6650: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 70  r(pTerm=pWC->a+p
6660: 53 63 61 6e 2d 3e 6b 3b 20 70 53 63 61 6e 2d 3e  Scan->k; pScan->
6670: 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 53  k<pWC->nTerm; pS
6680: 63 61 6e 2d 3e 6b 2b 2b 2c 20 70 54 65 72 6d 2b  can->k++, pTerm+
6690: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
66a0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
66b0: 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d  r==iCur && pTerm
66c0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
66d0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
66e0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
66f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
6700: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
6710: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
6720: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
6730: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20  pScan->aEquiv). 
6740: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
6750: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
6760: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
6770: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
6780: 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45  ollate(pTerm->pE
6790: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
67a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
67b0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
67c0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UMN );.         
67d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
67e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d  can->nEquiv; j+=
67f0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
6800: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71    if( pScan->aEq
6810: 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  uiv[j]==pX->iTab
6820: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
6830: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75    && pScan->aEqu
6840: 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f  iv[j+1]==pX->iCo
6850: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
6860: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
6880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6890: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
68a0: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
68b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
68c0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
68d0: 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  ] = pX->iTable;.
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
68f0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
6900: 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pX->iColumn;.
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
6920: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32  can->nEquiv += 2
6930: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6940: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6950: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
6960: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53  ->eOperator & pS
6970: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20  can->opMask)!=0 
6980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
6990: 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66  * Verify the aff
69a0: 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74  inity and collat
69b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74  ing sequence mat
69c0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
69d0: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f    if( pScan->zCo
69e0: 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d  llName && (pTerm
69f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6a00: 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  _ISNULL)==0 ){. 
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c               Col
6a20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
6a30: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
6a40: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6a60: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
6a70: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61  inityOk(pX, pSca
6a80: 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20  n->idxaff) ){.  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
6aa0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
6ad0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
6ae0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
6af0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
6b00: 61 72 65 43 6f 6c 6c 53 65 71 28 70 57 43 2d 3e  areCollSeq(pWC->
6b10: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
6b50: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
6b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6b70: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
6b80: 43 6f 6c 6c 20 3d 20 70 57 43 2d 3e 70 50 61 72  Coll = pWC->pPar
6b90: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
6ba0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
6bb0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6bc0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
6bd0: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
6be0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
6bf0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
6c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
6c30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6c40: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
6c50: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
6c60: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
6c70: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
6c80: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
6c90: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
6ca0: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
6cb0: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
6cc0: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
6cd0: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
6ce0: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6d00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d20: 20 20 20 20 70 53 63 61 6e 2d 3e 70 43 75 72 72      pScan->pCurr
6d30: 65 6e 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ent = pTerm;.   
6d40: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
6d50: 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  k++;.           
6d60: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
6d70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6d80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6d90: 20 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e     pWC = pScan->
6da0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
6db0: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
6dc0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
6dd0: 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70    }.    pScan->p
6de0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69  WC = pScan->pOri
6df0: 67 57 43 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  gWC;.    pScan->
6e00: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
6e10: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
6e20: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 70 43 75 72   }.  pScan->pCur
6e30: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  rent = 0;.  retu
6e40: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
6e50: 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52  nitialize a WHER
6e60: 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72  E clause scanner
6e70: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
6e80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6e90: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
6ea0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
6eb0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
6ec0: 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atches..**.** Th
6ed0: 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62  e scanner will b
6ee0: 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20  e searching the 
6ef0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43  WHERE clause pWC
6f00: 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a  .  It will look.
6f10: 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  ** for terms of 
6f20: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
6f30: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58   <expr>" where X
6f40: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75   is column iColu
6f50: 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69  mn of table.** i
6f60: 43 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d  Cur.  The <op> m
6f70: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  ust be one of th
6f80: 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63  e operators desc
6f90: 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e  ribed by opMask.
6fa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
6fb0: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
6fc0: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
6fd0: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
6fe0: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
6ff0: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65 72  ex pIdx..*/.Wher
7000: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
7010: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
7020: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
7030: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
7040: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
7050: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
7060: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7070: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
7080: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
7090: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
70a0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
70b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
70c0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
70d0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
70e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
70f0: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
7100: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
7110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7120: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
7130: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
7140: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
7150: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
7160: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
7170: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
7180: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 6d 65 6d 73    int j;..  mems
7190: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
71a0: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 0a 20 20  eof(*pScan));.  
71b0: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d  pScan->pOrigWC =
71c0: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
71d0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20  WC = pWC;.  if( 
71e0: 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e  pIdx && iColumn>
71f0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  =0 ){.    pScan-
7200: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
7210: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
7220: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
7230: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64      for(j=0; pId
7240: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
7250: 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  iColumn; j++){. 
7260: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
7270: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
7280: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7290: 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43   }.    pScan->zC
72a0: 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e  ollName = pIdx->
72b0: 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 0a 20  azColl[j];.  }. 
72c0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
72d0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
72e0: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
72f0: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
7300: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
7310: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
7320: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
7330: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
7340: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
7350: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
7360: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
7370: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
7380: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
7390: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
73a0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
73b0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
73c0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
73d0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
73e0: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
73f0: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
7400: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
7410: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
7420: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
7430: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
7440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
7450: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
7460: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
7470: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
7480: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
7490: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
74a0: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
74b0: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
74c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
74d0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
74e0: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
74f0: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
7500: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
7510: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
7520: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
7530: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
7540: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
7550: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
7560: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
7570: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
7580: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
7590: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
75a0: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
75b0: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
75c0: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
75d0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
75e0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
75f0: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
7600: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
7610: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
7620: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
7630: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
7640: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
7650: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
7660: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
7670: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
7680: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
7690: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
76a0: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
76b0: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
76c0: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
76d0: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
76e0: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
76f0: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
7700: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
7710: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
7720: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
7730: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
7740: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
7750: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
7760: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
7770: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
7780: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
7790: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
77a0: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
77b0: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
77c0: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
77d0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
77e0: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
77f0: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
7800: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
7810: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
7820: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
7830: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
7840: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
7850: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
7860: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
7870: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
7880: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
7890: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
78a0: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
78b0: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
78c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
78d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
78e0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
78f0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
7900: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
7910: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
7920: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
7930: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
7940: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
7950: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
7960: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
7970: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
7980: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
7990: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
79a0: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
79b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
79c0: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
79d0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
79e0: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
79f0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
7a00: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
7a10: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
7a20: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
7a30: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
7a40: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
7a50: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
7a60: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
7a70: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
7a80: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
7a90: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
7aa0: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
7ab0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
7ac0: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
7ad0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
7ae0: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
7af0: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
7b00: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
7b10: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
7b20: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7b30: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
7b40: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
7b50: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
7b60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
7b70: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
7b80: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
7b90: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
7ba0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
7bb0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
7bc0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
7bd0: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
7be0: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
7bf0: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
7c00: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
7c10: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
7c20: 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73  se.  .**.**.*/.s
7c30: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
7c40: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
7c50: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
7c60: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
7c70: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
7c80: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
7c90: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
7ca0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
7cb0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
7cc0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
7cd0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
7ce0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
7cf0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
7d00: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
7d10: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7d20: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
7d30: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
7d40: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
7d50: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
7d60: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
7d70: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
7d80: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
7d90: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
7da0: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
7db0: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
7dc0: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
7dd0: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
7de0: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
7df0: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
7e00: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
7e10: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
7e20: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
7e30: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
7e40: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
7e50: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
7e60: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
7e70: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
7e80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7e90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
7ea0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
7eb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7ec0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
7ed0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
7ee0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
7ef0: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
7f00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
7f10: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
7f20: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
7f30: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
7f40: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
7f50: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
7f60: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
7f70: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
7f80: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
7f90: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
7fa0: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
7fb0: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
7fc0: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
7fd0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
7fe0: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
7ff0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
8000: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
8010: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
8020: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
8030: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
8040: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
8050: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
8060: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
8070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
8080: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
8090: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
80a0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
80d0: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
80e0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8100: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
8110: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
8120: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
8130: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
8140: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
8150: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
8160: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8170: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
8180: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
8190: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
81a0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
81b0: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
81e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
81f0: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
8200: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
8210: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
8220: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8230: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8240: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
8250: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
8260: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
8270: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
8280: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
8290: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
82a0: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
82b0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
82c0: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
82d0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
82e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
82f0: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
8300: 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29  pLeft->pTab).  )
8310: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
8320: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
8330: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
8340: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
8350: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
8360: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
8370: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
8380: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
8390: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
83a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
83b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
83c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
83d0: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
83e0: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
83f0: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
8400: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
8410: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
8420: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
8430: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
8440: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
8450: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
8460: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
8470: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
8480: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
8490: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
84a0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
84b0: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
84c0: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
84d0: 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
84e0: 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f  (pReprepare, iCo
84f0: 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  l, SQLITE_AFF_NO
8500: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
8510: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
8520: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
8530: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
8540: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
8550: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8560: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
8570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8580: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
8590: 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a  ->pVdbe, iCol);.
85a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
85b0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  ht->op==TK_VARIA
85c0: 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  BLE || pRight->o
85d0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
85e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
85f0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
8600: 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75     z = pRight->u
8610: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69  .zToken;.  }.  i
8620: 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20  f( z ){.    cnt 
8630: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
8640: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
8650: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
8660: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
8670: 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ] ){.      cnt++
8680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8690: 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28  cnt!=0 && 255!=(
86a0: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
86b0: 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66       Expr *pPref
86c0: 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f  ix;.      *pisCo
86d0: 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30  mplete = c==wc[0
86e0: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
86f0: 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20  ;.      pPrefix 
8700: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
8710: 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b  , TK_STRING, z);
8720: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66  .      if( pPref
8730: 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e  ix ) pPrefix->u.
8740: 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b  zToken[cnt] = 0;
8750: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78  .      *ppPrefix
8760: 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20   = pPrefix;.    
8770: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
8780: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  IABLE ){.       
8790: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
87a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
87b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
87c0: 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68  Varmask(v, pRigh
87d0: 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
87e0: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
87f0: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
8800: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
8810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8820: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
8830: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
8840: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
8850: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
8860: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
8870: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
8880: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
8890: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
88a0: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
88b0: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
88c0: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
88d0: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
88e0: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
88f0: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
8900: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
8910: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
8920: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
8930: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
8940: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
8950: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
8960: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
8970: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
8980: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
8990: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
89a0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
89b0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
89c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
89d0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
89e0: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
89f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8a00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
8a10: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
8a20: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
8a30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
8a40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
8a50: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
8a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a70: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8a80: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
8a90: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
8aa0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
8ab0: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
8ac0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8ad0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
8ae0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
8af0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8b00: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8b10: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
8b20: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
8b30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
8b40: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
8b50: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
8b60: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
8b70: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
8b80: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
8b90: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
8ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8bb0: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
8bc0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
8bd0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
8be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
8bf0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
8c00: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
8c10: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
8c20: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
8c30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
8c40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
8c50: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
8c60: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
8c70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8c80: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
8c90: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
8ca0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
8cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8cc0: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
8cd0: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
8ce0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
8cf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8d00: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
8d10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8d20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8d30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
8d40: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
8d50: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
8d60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
8d70: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
8d80: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
8d90: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
8da0: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
8db0: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
8dc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
8dd0: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
8de0: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
8df0: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
8e00: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
8e10: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
8e20: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
8e30: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
8e40: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
8e50: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
8e60: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
8e70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8e80: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
8e90: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
8ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
8eb0: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
8ec0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
8ed0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
8ee0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
8ef0: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
8f00: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
8f10: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
8f20: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
8f30: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
8f40: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
8f70: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
8f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
8f90: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
8fa0: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
8fb0: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
8fc0: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
8fd0: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
8fe0: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
8ff0: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
9000: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
9010: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
9020: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
9030: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
9040: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
9050: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
9060: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
9070: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
9080: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
9090: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
90a0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
90b0: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
90c0: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
90d0: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
90e0: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
90f0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
9100: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
9110: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
9120: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
9130: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
9140: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
9150: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
9160: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
9170: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
9180: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
9190: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
91a0: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
91b0: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
91c0: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
91d0: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
91e0: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
91f0: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
9200: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
9210: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
9220: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
9230: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
9240: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
9250: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
9260: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
9270: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
9280: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
9290: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
92a0: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
92b0: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
92c0: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
92d0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
92e0: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
92f0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
9300: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
9310: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
9320: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
9330: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
9340: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
9350: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
9360: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
9370: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
9380: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
9390: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
93a0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
93b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
93c0: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
93d0: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
93e0: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
93f0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
9400: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
9410: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
9420: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
9430: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
9440: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
9450: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
9460: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
9470: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
9480: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
9490: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
94a0: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
94b0: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
94c0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
94d0: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
94e0: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
94f0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
9500: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
9510: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
9520: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
9530: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
9540: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
9550: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
9560: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
9570: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
9580: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
9590: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
95a0: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
95b0: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
95c0: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
95d0: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
95e0: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
95f0: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
9600: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
9610: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
9620: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
9630: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
9640: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
9650: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
9660: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
9670: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
9680: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
9690: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
96a0: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
96b0: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
96c0: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
96d0: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
96e0: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
96f0: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
9700: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
9710: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
9720: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
9730: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
9740: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
9750: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
9760: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
9770: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
9780: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
9790: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
97a0: 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f  e bestIndex() ro
97b0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72  utine will deter
97c0: 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  mine.  This anal
97d0: 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f  ysis.** only loo
97e0: 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75  ks at whether su
97f0: 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61  bterms appropria
9800: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
9810: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
9820: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
9830: 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20  ugh E above all 
9840: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
9850: 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a   But if a term.*
9860: 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65  * also statisfie
9870: 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61  s case 1 (such a
9880: 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61  s B) we know tha
9890: 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
98a0: 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70  will.** always p
98b0: 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f  refer case 1, so
98c0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   in that case we
98d0: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61   pretend that ca
98e0: 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  se 2 is not.** s
98f0: 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  atisfied..**.** 
9900: 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  It might be the 
9910: 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70  case that multip
9920: 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e  le tables are in
9930: 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78  dexable.  For ex
9940: 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62  ample,.** (E) ab
9950: 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ove is indexable
9960: 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c   on tables P, Q,
9970: 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65   and R..**.** Te
9980: 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79  rms that satisfy
9990: 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64   case 2 are cand
99a0: 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75  idates for looku
99b0: 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65  p by using.** se
99c0: 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74  parate indices t
99d0: 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f  o find rowids fo
99e0: 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61  r each subterm a
99f0: 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20  nd composing.** 
9a00: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c  the union of all
9a10: 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20   rowids using a 
9a20: 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  RowSet object.  
9a30: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a  This is similar.
9a40: 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e  ** to "bitmap in
9a50: 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20  dices" in other 
9a60: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73  database engines
9a70: 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53  ..**.** OTHERWIS
9a80: 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  E:.**.** If neit
9a90: 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63  her case 1 nor c
9aa0: 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65  ase 2 apply, the
9ab0: 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65  n leave the eOpe
9ac0: 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20  rator set to.** 
9ad0: 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d  zero.  This term
9ae0: 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
9af0: 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74  or search..*/.st
9b00: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
9b10: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53  alyzeOrTerm(.  S
9b20: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
9b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
9b40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
9b50: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
9b60: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
9b70: 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45  e complete WHERE
9b80: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
9b90: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
9ba0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9bb0: 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74  of the OR-term t
9bc0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9bd0: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
9be0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
9bf0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
9c00: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
9c10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9c20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c40: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9c50: 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
9c60: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
9c70: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20  ->a[idxTerm];   
9c80: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
9c90: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
9ca0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
9cb0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20  Term->pExpr;    
9cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9cd0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
9ce0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  e term */.  Wher
9cf0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
9d00: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
9d10: 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65  et; /* Table use
9d20: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   masks */.  int 
9d30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9d60: 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
9d70: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
9d80: 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f      /* Breakup o
9d90: 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62  f pTerm into sub
9da0: 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
9db0: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20  Term *pOrTerm;  
9dc0: 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65       /* A Sub-te
9dd0: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f  rm within the pO
9de0: 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  rWc */.  WhereOr
9df0: 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20  Info *pOrInfo;  
9e00: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
9e10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73   information ass
9e20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65  ociated with pTe
9e30: 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  rm */.  Bitmask 
9e40: 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20  chngToIN;       
9e50: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
9e60: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
9e70: 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61  ase 1 */.  Bitma
9e80: 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  sk indexable;   
9e90: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
9ea0: 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c  hat are indexabl
9eb0: 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61  e, satisfying ca
9ec0: 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  se 2 */..  /*.  
9ed0: 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20  ** Break the OR 
9ee0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20  clause into its 
9ef0: 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d  separate subterm
9f00: 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73  s.  The subterms
9f10: 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64   are.  ** stored
9f20: 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73   in a WhereClaus
9f30: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
9f40: 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68  aining within th
9f50: 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20  e WhereOrInfo.  
9f60: 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
9f70: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
9f80: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c  e original OR cl
9f90: 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a  ause term..  */.
9fa0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
9fb0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
9fc0: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f  M_DYNAMIC|TERM_O
9fd0: 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e  RINFO|TERM_ANDIN
9fe0: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  FO))==0 );.  ass
9ff0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
a000: 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d  TK_OR );.  pTerm
a010: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f  ->u.pOrInfo = pO
a020: 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  rInfo = sqlite3D
a030: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
a040: 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29  sizeof(*pOrInfo)
a050: 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f  );.  if( pOrInfo
a060: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a070: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
a080: 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20  = TERM_ORINFO;. 
a090: 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66   pOrWc = &pOrInf
a0a0: 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c  o->wc;.  whereCl
a0b0: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
a0c0: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
a0d0: 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72  skSet, pWC->wctr
a0e0: 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65  lFlags);.  where
a0f0: 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78  Split(pOrWc, pEx
a100: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78  pr, TK_OR);.  ex
a110: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
a120: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
a130: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a140: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
a150: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
a160: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
a170: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
a180: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
a190: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
a1a0: 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20   cases 1 or 2.. 
a1b0: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
a1c0: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
a1d0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
a1e0: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
a1f0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
a200: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
a210: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
a220: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
a230: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
a240: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
a250: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
a260: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
a270: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
a280: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
a290: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
a2a0: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
a2b0: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
a2c0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
a2d0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
a2e0: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
a2f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
a300: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64  db, sizeof(*pAnd
a310: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
a320: 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20  ( pAndInfo ){.  
a330: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
a340: 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20  e *pAndWC;.     
a350: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
a360: 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  ndTerm;.        
a370: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42  int j;.        B
a380: 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20  itmask b = 0;.  
a390: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75        pOrTerm->u
a3a0: 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64  .pAndInfo = pAnd
a3b0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f  Info;.        pO
a3c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
a3d0: 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a  = TERM_ANDINFO;.
a3e0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
a3f0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
a400: 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  AND;.        pAn
a410: 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d  dWC = &pAndInfo-
a420: 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65  >wc;.        whe
a430: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e  reClauseInit(pAn
a440: 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  dWC, pWC->pParse
a450: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
a460: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
a470: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
a480: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
a490: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
a4a0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
a4b0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
a4c0: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
a4d0: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
a4e0: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
a4f0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
a500: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a510: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
a520: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a530: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
a540: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
a550: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
a560: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
a570: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
a580: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
a590: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
a5a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
a5b0: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
a5c0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
a5e0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
a5f0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
a600: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
a610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
a630: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
a640: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
a650: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
a660: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
a670: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
a680: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
a690: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
a6a0: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
a6b0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
a6c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
a6d0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
a6e0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
a6f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a700: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
a710: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
a720: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
a730: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
a740: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
a750: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a760: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
a770: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
a780: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
a790: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
a7a0: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
a7b0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
a7c0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
a7d0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
a7e0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
a7f0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
a800: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
a810: 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
a820: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  ){.        chngT
a830: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  oIN = 0;.      }
a840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
a850: 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20  ngToIN &= b;.   
a860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a870: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64    /*.  ** Record
a880: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
a890: 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  es that satisfy 
a8a0: 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74  case 2.  The set
a8b0: 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65   might be.  ** e
a8c0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  mpty..  */.  pOr
a8d0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
a8e0: 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70  = indexable;.  p
a8f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a900: 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f  = indexable==0 ?
a910: 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f   0 : WO_OR;..  /
a920: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
a930: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
a940: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
a950: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
a960: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
a970: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
a980: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
a990: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
a9a0: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
a9b0: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
a9c0: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
a9d0: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
a9e0: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
a9f0: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
aa00: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
aa10: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
aa20: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
aa30: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
aa40: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
aa50: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
aa60: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
aa70: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
aa80: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
aa90: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
aaa0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
aab0: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
aac0: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
aad0: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
aae0: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
aaf0: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
ab00: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
ab10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
ab20: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
ab30: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
ab40: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
ab50: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
ab60: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
ab70: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
ab80: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
ab90: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
aba0: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
abb0: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
abc0: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
abd0: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
abe0: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
abf0: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
ac00: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
ac10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
ac20: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
ac30: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
ac40: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
ac50: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
ac60: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
ac70: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
ac80: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
ac90: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
aca0: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
acb0: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
acc0: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
acd0: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
ace0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
acf0: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
ad00: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
ad10: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
ad20: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
ad30: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
ad40: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
ad50: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
ad60: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
ad70: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
ad80: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
ad90: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
ada0: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
adb0: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
adc0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
add0: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
ade0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
adf0: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
ae00: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
ae10: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
ae20: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
ae30: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
ae40: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
ae50: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
ae60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ae70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ae80: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
ae90: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
aea0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
aeb0: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
aec0: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
aed0: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
aee0: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
aef0: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
af00: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
af10: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
af20: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
af30: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
af40: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
af50: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
af60: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
af70: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
af80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
af90: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
afa0: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
afb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
afc0: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
afd0: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
afe0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
aff0: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
b000: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
b010: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
b020: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
b030: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
b040: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
b050: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
b060: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
b070: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b080: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
b090: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
b0a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
b0b0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
b0c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
b0d0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
b0e0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
b0f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
b100: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
b110: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
b120: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
b130: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
b140: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
b150: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
b160: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
b170: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
b180: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
b190: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
b1a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b1b0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
b1c0: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
b1d0: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
b1e0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
b1f0: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
b200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
b210: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
b220: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
b230: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
b240: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
b250: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
b260: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
b270: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
b280: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
b290: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
b2a0: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
b2b0: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
b2c0: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
b2d0: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
b2e0: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
b2f0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
b300: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
b310: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b320: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
b330: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
b340: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
b350: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
b360: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
b370: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
b380: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
b390: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
b3a0: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
b3b0: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
b3c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b3d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b3e0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
b3f0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
b400: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
b410: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
b420: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
b430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b440: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
b450: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
b460: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
b470: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
b480: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
b490: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
b4a0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
b4b0: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
b4c0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
b4d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b4e0: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
b4f0: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
b500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
b510: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
b520: 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f  pMaskSet, iCurso
b530: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  r) );.        br
b540: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b550: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
b560: 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
b570: 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63  e have found a c
b580: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61  andidate table a
b590: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63  nd column.  Chec
b5a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  k to see if that
b5b0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
b5c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f  and column is co
b5d0: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
b5e0: 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  rm in the OR cla
b5f0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54  use */.      okT
b600: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20  oChngToIN = 1;. 
b610: 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20       for(; i>=0 
b620: 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  && okToChngToIN;
b630: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
b640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b650: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
b660: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
b670: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
b680: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
b690: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
b6a0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
b6b0: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
b6c0: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
b6d0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
b6e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  ->u.leftColumn!=
b6f0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
b700: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
b710: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  N = 0;.        }
b720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b730: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
b740: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
b750: 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74   /* If the right
b760: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
b770: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
b780: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
b790: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
b7a0: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
b7b0: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
b7c0: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
b7d0: 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a  type.          *
b7e0: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  * conversions ar
b7f0: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
b800: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
b810: 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20  t #2249).       
b820: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
b830: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
b840: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
b850: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
b860: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
b870: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
b880: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
b890: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
b8a0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
b8b0: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d    if( affRight!=
b8c0: 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61  0 && affRight!=a
b8d0: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  ffLeft ){.      
b8e0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
b8f0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
b900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b910: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
b920: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
b930: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
b940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b950: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b960: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
b970: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20  okToChngToIN is 
b980: 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c  true if original
b990: 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73   pTerm satisfies
b9a0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20  .    ** case 1. 
b9b0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63   In that case, c
b9c0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76  onstruct a new v
b9d0: 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74  irtual term that
b9e0: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72   is .    ** pTer
b9f0: 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  m converted into
ba00: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
ba10: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
ba20: 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30  V: R-00211-15100
ba30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ba40: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a  okToChngToIN ){.
ba50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
ba60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ba70: 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c  A transient dupl
ba80: 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  icate expression
ba90: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
baa0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  st *pList = 0;  
bab0: 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74   /* The RHS of t
bac0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
bad0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
bae0: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
baf0: 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
bb00: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
bb10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
bb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb30: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20  The complete IN 
bb40: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
bb50: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
bb60: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
bb70: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b  =pOrWc->a; i>=0;
bb80: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
bb90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
bba0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
bbb0: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
bbc0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bbd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
bbe0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
bbf0: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
bc00: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
bc10: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
bc20: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
bc30: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
bc40: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
bc50: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
bc60: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
bc70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bc80: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
bc90: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
bca0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
bcb0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
bcc0: 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c  (pWC->pParse, pL
bcd0: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
bce0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
bcf0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
bd00: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
bd10: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
bd20: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
bd30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bd40: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
bd50: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
bd60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bd70: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
bd80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
bd90: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
bda0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bdb0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
bdc0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
bdd0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
bde0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
bdf0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
be00: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
be10: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
be20: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
be30: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
be40: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
be50: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
be60: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
be70: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
be80: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
be90: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
bea0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
beb0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
bec0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
bed0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bee0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
bef0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
bf00: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
bf10: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bf20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
bf30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
bf40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
bf50: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
bf60: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
bf70: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
bf80: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
bf90: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
bfa0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
bfb0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
bfc0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
bfd0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
bfe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
bff0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
c000: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
c010: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
c020: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
c030: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
c040: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
c050: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
c060: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
c070: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
c080: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
c090: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
c0a0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
c0b0: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
c0c0: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
c0d0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
c0e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
c0f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
c100: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
c110: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
c120: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
c130: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
c140: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
c150: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c160: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
c170: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
c180: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
c190: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
c1a0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
c1b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
c1c0: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
c1d0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
c1e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
c1f0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
c200: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
c210: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
c220: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
c230: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
c240: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
c250: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
c260: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
c270: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
c280: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
c290: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
c2a0: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
c2b0: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
c2c0: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
c2d0: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
c2e0: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
c2f0: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
c300: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
c310: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
c320: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
c330: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
c340: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
c350: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
c360: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
c370: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
c380: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
c390: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
c3a0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
c3b0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
c3c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
c3d0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
c3e0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
c3f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
c400: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
c410: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
c420: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
c430: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
c440: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
c450: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
c460: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
c470: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
c480: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
c490: 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20  pMaskSet;       
c4a0: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62     /* Set of tab
c4b0: 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a  le index masks *
c4c0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  /.  Expr *pExpr;
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c4f0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
c500: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
c510: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20  sk prereqLeft;  
c520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c530: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
c540: 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
c550: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
c560: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20  ereqAll;        
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 70 45 78 70 72  uesites of pExpr
c590: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
c5a0: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20  traRight = 0;   
c5b0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
c5c0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
c5d0: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45  LEFT JOIN */.  E
c5e0: 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20  xpr *pStr1 = 0; 
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
c610: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
c620: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
c630: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c640: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
c650: 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68  E/GLOB ends with
c660: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69   wildcard */.  i
c670: 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20  nt noCase = 0;  
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73  /* LIKE/GLOB dis
c6a0: 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20  tinguishes case 
c6b0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76        /* Top-lev
c6e0: 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45  el operator.  pE
c6f0: 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72  xpr->op */.  Par
c700: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
c710: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
c720: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c730: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
c740: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
c750: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
c760: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
c770: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
c780: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c790: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
c7a0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c7b0: 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53  xTerm];.  pMaskS
c7c0: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
c7d0: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
c7e0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73  erm->pExpr;.  as
c7f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
c800: 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d  =TK_AS && pExpr-
c810: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op!=TK_COLLATE 
c820: 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  );.  prereqLeft 
c830: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
c840: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
c850: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d  ->pLeft);.  op =
c860: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
c870: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
c880: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c890: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
c8a0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
c8b0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
c8c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
c8d0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
c8e0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65  eqRight = exprSe
c8f0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
c900: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
c910: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
c920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
c930: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
c940: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
c950: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c960: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
c970: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c980: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
c990: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  ){.    pTerm->pr
c9a0: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
c9b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72   }else{.    pTer
c9c0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
c9d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c9e0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
c9f0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
ca00: 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72  prereqAll = expr
ca10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ca20: 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  Set, pExpr);.  i
ca30: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
ca40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
ca50: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69  mJoin) ){.    Bi
ca60: 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73  tmask x = getMas
ca70: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
ca80: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
ca90: 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41  le);.    prereqA
caa0: 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74  ll |= x;.    ext
cab0: 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20  raRight = x-1;  
cac0: 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  /* ON clause ter
cad0: 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ms may not be us
cae0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
caf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cb00: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65          ** on le
cb10: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ft table of a LE
cb20: 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74  FT JOIN.  Ticket
cb30: 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20   #3015 */.  }.  
cb40: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
cb50: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
cb60: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
cb70: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
cb80: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
cb90: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
cba0: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
cbb0: 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20  owedOp(op) ){.  
cbc0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
cbd0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
cbe0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c  ollate(pExpr->pL
cbf0: 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a  eft);.    Expr *
cc00: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
cc10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cc20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
cc30: 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d      u16 opMask =
cc40: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
cc50: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
cc60: 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a  t)==0 ? WO_ALL :
cc70: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69   WO_EQUIV;.    i
cc80: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
cc90: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
cca0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ccb0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
ccc0: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
ccd0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
cce0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
ccf0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
cd00: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
cd10: 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61  rMask(op) & opMa
cd20: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sk;.    }.    if
cd30: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
cd40: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
cd50: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
cd60: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
cd70: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
cd80: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70      u16 eExtraOp
cd90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
cda0: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70  Extra bits for p
cdb0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  New->eOperator *
cdc0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  /.      if( pTer
cdd0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
cde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cdf0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
ce00: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
ce10: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
ce20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ce30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ce40: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
ce50: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
ce60: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
ce70: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ce80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ce90: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
cea0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ceb0: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
cec0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
ced0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
cee0: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
cef0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
cf00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
cf10: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
cf20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
cf30: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
cf40: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
cf50: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
cf60: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
cf70: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
cf80: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
cf90: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69  OPIED;.        i
cfa0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
cfb0: 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20  _EQ.         && 
cfc0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
cfd0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
cfe0: 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26  oin).         &&
cff0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
d000: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
d010: 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20  Transitive).    
d020: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d030: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
d040: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  r |= WO_EQUIV;. 
d050: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f           eExtraO
d060: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  p = WO_EQUIV;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d080: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
d090: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
d0a0: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
d0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
d0c0: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
d0d0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
d0e0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
d0f0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
d100: 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  Dup->pLeft);.   
d110: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
d120: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
d130: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
d140: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
d150: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
d160: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d170: 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78  (prereqLeft | ex
d180: 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65  traRight) != pre
d190: 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  reqLeft );.     
d1a0: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
d1b0: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ht = prereqLeft 
d1c0: 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20  | extraRight;.  
d1d0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
d1e0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
d1f0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
d200: 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74  erator = (operat
d210: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
d220: 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f   + eExtraOp) & o
d230: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMask;.    }.  }
d240: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d250: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
d260: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
d270: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
d280: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
d290: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
d2a0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
d2b0: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
d2c0: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
d2d0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
d2e0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
d2f0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
d300: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
d310: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
d320: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
d330: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
d340: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
d350: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
d360: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
d370: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
d380: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
d390: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d3a0: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
d3b0: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
d3c0: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
d3d0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
d3e0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
d3f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
d400: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
d410: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
d420: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
d430: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
d440: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
d450: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
d460: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
d470: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
d480: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
d490: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
d4a0: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
d4b0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
d4c0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
d4d0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
d4e0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
d4f0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
d500: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
d510: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
d520: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
d530: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
d540: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
d550: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d560: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
d570: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d580: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
d590: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
d5a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
d5b0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
d5c0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
d5d0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
d5e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
d5f0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d620: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
d630: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d660: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
d670: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
d680: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
d690: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
d6a0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
d6b0: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
d6c0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
d6d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d6e0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
d6f0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
d700: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
d710: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
d720: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
d730: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
d740: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
d750: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
d760: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
d770: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
d780: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d790: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
d7a0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
d7b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d7c0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
d7d0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
d7e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
d7f0: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
d800: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
d810: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
d820: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
d830: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
d840: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
d850: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
d860: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
d870: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
d880: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
d890: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
d8a0: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
d8b0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
d8c0: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
d8d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d8e0: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
d8f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
d900: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
d910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d920: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
d930: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
d940: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
d950: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
d960: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
d970: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
d980: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
d990: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
d9a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
d9b0: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
d9c0: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
d9d0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
d9e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
d9f0: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
da00: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
da10: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
da20: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
da30: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
da40: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
da50: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
da60: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
da70: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
da80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
da90: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
daa0: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
dab0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
dac0: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
dad0: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
dae0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
daf0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
db00: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
db10: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
db20: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
db30: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
db40: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
db50: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
db60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
db70: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
db80: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
db90: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
dba0: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
dbb0: 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61  Token sCollSeqNa
dbc0: 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
dbd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
dbe0: 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  ce */..    pLeft
dbf0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
dc00: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
dc10: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
dc20: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
dc30: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
dc40: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
dc50: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
dc60: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
dc70: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
dc80: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
dc90: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
dca0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
dcb0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
dcc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
dcd0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
dce0: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
dcf0: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
dd00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
dd10: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
dd20: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
dd30: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
dd40: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
dd50: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
dd60: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
dd70: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
dd80: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
dd90: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
dda0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
ddb0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
ddc0: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
ddd0: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
dde0: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
ddf0: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
de00: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
de10: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
de20: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
de30: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
de40: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
de50: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
de60: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
de70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
de80: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
de90: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
dea0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
deb0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
dec0: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
ded0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
dee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
def0: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
df00: 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e   }.    sCollSeqN
df10: 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f  ame.z = noCase ?
df20: 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e   "NOCASE" : "BIN
df30: 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53  ARY";.    sCollS
df40: 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20  eqName.n = 6;.  
df50: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
df60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
df70: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
df80: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
df90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
dfa0: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
dfb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
dfc0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
dfd0: 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c  Parse,pNewExpr1,
dfe0: 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
dff0: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
e000: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
e010: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
e020: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
e030: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
e040: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
e050: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
e060: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
e070: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
e080: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
e090: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
e0a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e0b0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e0c0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
e0d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
e0e0: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
e0f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e100: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
e110: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
e120: 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr2,&sCollSeqNam
e130: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
e140: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
e150: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
e160: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
e170: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
e180: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
e190: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
e1a0: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
e1b0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
e1c0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
e1d0: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
e1e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
e1f0: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
e200: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
e210: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
e220: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
e230: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
e240: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
e250: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e260: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
e270: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
e280: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e290: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
e2a0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
e2b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e2c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
e2d0: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
e2e0: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
e2f0: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
e300: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
e310: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
e320: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
e330: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
e340: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
e350: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e360: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
e370: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
e380: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
e390: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
e3a0: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
e3b0: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
e3c0: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
e3d0: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
e3e0: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
e3f0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
e400: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
e410: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
e420: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
e430: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
e440: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
e450: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
e460: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
e470: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
e480: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
e490: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
e4a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
e4b0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
e4c0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
e4d0: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
e4e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
e4f0: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
e500: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
e510: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
e520: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
e530: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
e540: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
e550: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
e560: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
e570: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
e580: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
e590: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
e5a0: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
e5d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
e5e0: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
e5f0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
e600: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
e610: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
e620: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
e630: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
e640: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
e650: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
e660: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
e670: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
e680: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
e690: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
e6a0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
e6b0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
e6c0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
e6d0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
e6e0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
e6f0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
e700: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
e710: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
e720: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
e730: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
e740: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
e750: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
e760: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
e770: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
e780: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
e790: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
e7a0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
e7b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
e7c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
e7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e7e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e7f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
e800: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e810: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f  ENABLE_STAT3.  /
e820: 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
e830: 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
e840: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
e850: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
e860: 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
e870: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
e880: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
e890: 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
e8a0: 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
e8b0: 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
e8c0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
e8d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
e8e0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
e8f0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
e900: 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
e910: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
e920: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
e930: 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
e940: 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
e950: 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
e960: 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
e970: 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
e980: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
e990: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
e9a0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
e9b0: 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
e9c0: 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
e9d0: 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
e9e0: 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
e9f0: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
ea00: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
ea10: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
ea20: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
ea30: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
ea40: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
ea50: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
ea60: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
ea70: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
ea80: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
ea90: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
eaa0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
eab0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
eac0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
ead0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
eae0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
eaf0: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
eb00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
eb10: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eb40: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
eb50: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
eb80: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c  (pParse, TK_NULL
eb90: 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a  , 0, 0, 0), 0);.
eba0: 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68  .    idxNew = wh
ebb0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
ebc0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52               TER
ebf0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
ec00: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c  YNAMIC|TERM_VNUL
ec10: 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e  L);.    if( idxN
ec20: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
ec30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ec40: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
ec50: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
ec60: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ght = 0;.      p
ec70: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
ec80: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
ec90: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
eca0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ecb0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
ecc0: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
ecd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
ece0: 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65  WO_GT;.      pNe
ecf0: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
ed00: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ed10: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ed20: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ed30: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ed40: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
ed50: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
ed60: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
ed70: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
ed80: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
ed90: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
eda0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
edb0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a  _ENABLE_STAT */.
edc0: 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e  .  /* Prevent ON
edd0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
ede0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f   a LEFT JOIN fro
edf0: 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  m being used to 
ee00: 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  drive.  ** an in
ee10: 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74  dex for tables t
ee20: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
ee30: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e join..  */.  p
ee40: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ee50: 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b  t |= extraRight;
ee60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ee70: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
ee80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ee90: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
eea0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
eeb0: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70  nt.** for an exp
eec0: 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20  ression of type 
eed0: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
eee0: 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d  efers to the sam
eef0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20  e column and.** 
ef00: 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  uses the same co
ef10: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ef20: 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20   as the iCol'th 
ef30: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
ef40: 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e  pIdx..** Argumen
ef50: 74 20 69 42 61 73 65 20 69 73 20 74 68 65 20 63  t iBase is the c
ef60: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65  ursor number use
ef70: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
ef80: 74 68 61 74 20 70 49 64 78 20 72 65 66 65 72 73  that pIdx refers
ef90: 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  .** to..**.** If
efa0: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
efb0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
efc0: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
efd0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
efe0: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
eff0: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
f000: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
f010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
f020: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
f030: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f050: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
f060: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f070: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
f080: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
f090: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
f0a0: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
f0b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f0c0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
f0d0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
f0e0: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
f0f0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
f100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f110: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
f120: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
f130: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
f160: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
f170: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
f180: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f190: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
f1a0: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
f1b0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f1c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f1d0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
f1e0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
f1f0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
f200: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
f210: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
f220: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
f230: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
f240: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
f250: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
f260: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
f270: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
f280: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f290: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
f2a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f2b0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
f2c0: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
f2d0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
f2e0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
f2f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f300: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
f310: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
f320: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
f330: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
f340: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
f350: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
f360: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
f370: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
f380: 75 6e 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e  undant. A DISTIN
f390: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
f3a0: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
f3b0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a  base contains a.
f3c0: 2a 2a 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  ** UNIQUE index 
f3d0: 74 68 61 74 20 67 75 61 72 61 6e 74 65 65 73 20  that guarantees 
f3e0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
f3f0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 77 69 6c  of the query wil
f400: 6c 20 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a  l be distinct.**
f410: 20 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74   anyway..*/.stat
f420: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
f430: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
f440: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53  rse *pParse,.  S
f450: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
f460: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f470: 2a 70 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74  *pWC,.  ExprList
f480: 20 2a 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20   *pDistinct.){. 
f490: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f4a0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
f4b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f4d0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
f4e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
f4f0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
f500: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
f510: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
f520: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
f530: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
f540: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
f550: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
f560: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
f570: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
f580: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
f590: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
f5a0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
f5b0: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
f5c0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
f5d0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
f5e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
f5f0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
f600: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
f610: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
f620: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
f630: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
f640: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
f650: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
f660: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
f670: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
f680: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
f690: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
f6a0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
f6b0: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
f6c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
f6d0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
f6e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
f6f0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
f700: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
f710: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
f720: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
f730: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
f740: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
f750: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
f760: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
f770: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
f780: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
f790: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
f7a0: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
f7b0: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
f7c0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
f7d0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
f7e0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
f7f0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
f800: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
f810: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
f820: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
f830: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
f840: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
f850: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
f860: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
f870: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
f880: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
f890: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
f8a0: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
f8b0: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
f8c0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
f8d0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
f8e0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
f8f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
f900: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
f910: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
f920: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
f930: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
f940: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
f950: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
f960: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
f970: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
f980: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
f990: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
f9a0: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
f9b0: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
f9c0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
f9d0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
f9e0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
f9f0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
fa00: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
fa10: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
fa20: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
fa30: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
fa40: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
fa50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
fa60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
fa70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
fa80: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
fa90: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
faa0: 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
fab0: 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
fac0: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
fad0: 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
fae0: 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
faf0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
fb00: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
fb10: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
fb20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
fb30: 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
fb40: 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
fb50: 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
fb60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
fb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
fb90: 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
fba0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
fbb0: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
fbc0: 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
fbd0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
fbe0: 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
fbf0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
fc00: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
fc10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fc20: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
fc30: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
fc40: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
fc50: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
fc60: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
fc70: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
fc80: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
fc90: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
fca0: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
fcb0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
fcc0: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  orming operation
fcd0: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
fce0: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
fcf0: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
fd00: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
fd10: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
fd20: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
fd30: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
fd40: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
fd50: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
fd60: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
fd70: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20  uble logN = 1;. 
fd80: 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a   double x = 10;.
fd90: 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
fda0: 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20      logN += 1;. 
fdb0: 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a     x *= 10;.  }.
fdc0: 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d    return logN;.}
fdd0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
fde0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
fdf0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
fe00: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
fe10: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
fe20: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
fe30: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
fe40: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
fe50: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
fe60: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
fe70: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
fe80: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
fe90: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
fea0: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
feb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fec0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
fed0: 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
fee0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
fef0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
ff00: 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
ff10: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
ff20: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
ff30: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
ff40: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
ff50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ff60: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
ff70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
ff80: 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
ff90: 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
ffa0: 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
ffb0: 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
ffc0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
ffd0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
ffe0: 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
fff0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
10000 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
10010 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
10020 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
10030 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10040 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
10050 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
10060 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
10070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10080 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10090 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
100a0 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
100b0 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
100c0 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
100d0 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
100e0 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
100f0 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
10100 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
10110 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
10120 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
10130 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
10140 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
10150 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
10160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
10170 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10190 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
101a0 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
101b0 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
101c0 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
101d0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
101e0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
101f0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10200 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
10210 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
10220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10230 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
10240 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
10250 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10260 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
10270 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
10280 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10290 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
102a0 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
102b0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
102c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
102d0 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
102e0 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
102f0 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
10300 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
10310 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
10320 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
10330 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
10340 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
10350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10360 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
10370 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10380 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
10390 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
103a0 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
103b0 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
103c0 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
103d0 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
103e0 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
103f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
10400 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
10410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10420 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
10430 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10440 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
10450 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
10460 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
10470 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
10480 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
10490 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
104a0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
104b0 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
104c0 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
104d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
104e0 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
104f0 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
10500 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
10510 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
10520 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
10530 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
10540 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
10550 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10560 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
10570 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
10580 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
10590 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
105a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
105b0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
105c0 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
105d0 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
105e0 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
105f0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
10600 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
10610 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
10620 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
10630 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
10640 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
10650 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
10660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10670 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
10680 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10690 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
106a0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
106b0 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
106c0 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
106d0 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
106e0 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
106f0 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
10700 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
10710 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
10720 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
10730 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
10740 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
10750 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
10760 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10780 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10790 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
107a0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
107b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
107c0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
107d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
107e0 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
107f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
10800 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
10810 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
10820 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10840 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
10850 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
10860 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
10870 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
10880 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
10890 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
108a0 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
108d0 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
108e0 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
108f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10900 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
10910 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
10920 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
10930 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
10940 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
10950 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
10960 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
10970 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
10980 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
10990 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
109a0 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
109b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
109c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
109d0 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
109e0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
109f0 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
10a00 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10a10 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
10a20 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
10a30 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
10a40 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
10a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a60 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10a70 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
10a80 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
10a90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ab0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
10ac0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
10ad0 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
10ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
10af0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10b00 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
10b10 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b30 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
10b40 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
10b50 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b70 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
10b80 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
10b90 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
10bc0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10bf0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
10c00 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
10c10 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
10c20 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
10c30 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
10c40 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
10c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10c60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10c70 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
10c80 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
10c90 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
10ca0 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
10cb0 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
10cc0 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
10cd0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
10ce0 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
10cf0 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
10d00 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
10d10 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
10d20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
10d30 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
10d40 20 20 63 6f 6e 73 74 20 69 6e 74 20 6d 78 43 6f    const int mxCo
10d50 6e 73 74 72 61 69 6e 74 20 3d 20 31 30 3b 20 2f  nstraint = 10; /
10d60 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
10d70 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
10d80 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
10d90 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
10da0 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
10db0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
10dc0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
10dd0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
10de0 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
10df0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
10e00 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
10e10 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
10e20 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
10e30 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
10e40 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
10e50 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
10e60 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
10e70 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10e80 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
10e90 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
10ea0 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
10eb0 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
10ec0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
10ed0 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30  */.  nColumn = 0
10ee0 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
10ef0 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
10f00 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
10f10 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70  >nTerm];.  pLoop
10f20 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
10f30 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  p;.  idxCols = 0
10f40 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d  ;.  pLoop->aTerm
10f50 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
10f60 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
10f70 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 2c 0a 20 20  pLoop->aTerm,.  
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 6d 78 43 6f 6e 73 74 72 61 69 6e 74 2a 73 69 7a  mxConstraint*siz
10fb0 65 6f 66 28 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d  eof(pLoop->aTerm
10fc0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f  [0]));.  if( pLo
10fd0 6f 70 2d 3e 61 54 65 72 6d 3d 3d 30 20 29 20 72  op->aTerm==0 ) r
10fe0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 54 65  eturn;.  for(pTe
10ff0 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
11000 3c 70 57 43 45 6e 64 20 26 26 20 70 4c 6f 6f 70  <pWCEnd && pLoop
11010 2d 3e 6e 54 65 72 6d 3c 6d 78 43 6f 6e 73 74 72  ->nTerm<mxConstr
11020 61 69 6e 74 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  aint; pTerm++){.
11030 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
11040 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
11050 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
11060 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
11070 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
11080 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
11090 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
110a0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
110b0 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
110c0 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
110d0 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  <<iCol;.      te
110e0 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
110f0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
11100 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
11110 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
11120 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
11130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
11140 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6e 43 6f 6c 75  oop->aTerm[nColu
11150 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  mn++] = pTerm;. 
11160 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
11170 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  = cMask;.      }
11180 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11190 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  ert( nColumn>0 )
111a0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
111b0 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  ee.nEq = pLoop->
111c0 6e 54 65 72 6d 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  nTerm = nColumn;
111d0 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
111e0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
111f0 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
11200 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
11210 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
11220 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
11230 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 0a 20  E_TEMP_INDEX;.. 
11240 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
11250 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
11260 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
11270 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
11280 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
11290 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
112a0 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
112b0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
112c0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
112d0 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
112e0 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
112f0 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
11300 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
11310 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
11320 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
11330 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
11340 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
11350 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
11360 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
11370 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
11380 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
11390 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
113a0 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
113b0 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
113c0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
113d0 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
113e0 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
113f0 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
11400 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
11410 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
11420 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28  & (~idxCols | ((
11430 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
11440 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43  S-1)));.  mxBitC
11450 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43  ol = (pTable->nC
11460 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42  ol >= BMS-1) ? B
11470 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e  MS-1 : pTable->n
11480 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Col;.  testcase(
11490 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
114a0 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
114b0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
114c0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
114d0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
114e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
114f0 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
11500 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20  itmask)1)<<i) ) 
11510 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20  nColumn++;.  }. 
11520 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
11530 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
11540 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
11550 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70      nColumn += p
11560 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
11570 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f  S + 1;.  }.  pLo
11580 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
11590 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
115a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
115b0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
115c0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
115d0 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
115e0 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42  is index */.  nB
115f0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64  yte = sizeof(Ind
11600 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20  ex);.  nByte += 
11610 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69  nColumn*sizeof(i
11620 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65  nt);     /* Inde
11630 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  x.aiColumn */.  
11640 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
11650 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20  *sizeof(char*); 
11660 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
11670 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  l */.  nByte += 
11680 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
11690 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
116a0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
116b0 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
116c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
116d0 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  rse->db, nByte);
116e0 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
116f0 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
11700 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
11710 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
11720 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
11730 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49  *)&pIdx[1];.  pI
11740 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
11750 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f  int*)&pIdx->azCo
11760 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70  ll[nColumn];.  p
11770 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
11780 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69  = (u8*)&pIdx->ai
11790 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b  Column[nColumn];
117a0 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
117b0 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
117c0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
117d0 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78   nColumn;.  pIdx
117e0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
117f0 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
11800 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
11810 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
11820 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
11830 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
11840 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
11850 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
11860 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
11870 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
11880 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
11890 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
118a0 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
118b0 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ? ((Bitmask)1)<
118c0 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74  <(BMS-1) : ((Bit
118d0 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20  mask)1)<<iCol;. 
118e0 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
118f0 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
11900 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
11910 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
11920 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
11930 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
11940 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
11950 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
11960 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
11970 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
11980 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
11990 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
119a0 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
119b0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
119c0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
119d0 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29   = ALWAYS(pColl)
119e0 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
119f0 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
11a00 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
11a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11a20 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
11a30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
11a40 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
11a50 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
11a60 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
11a70 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
11a80 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
11a90 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
11aa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
11ab0 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
11ac0 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
11ad0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
11ae0 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  <i) ){.      pId
11af0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
11b00 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
11b10 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
11b20 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
11b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11b40 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
11b50 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
11b60 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
11b70 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
11b80 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
11b90 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
11ba0 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
11bb0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
11bc0 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
11bd0 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
11be0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
11bf0 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a   n==nColumn );..
11c00 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
11c10 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
11c20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20  */.  pKeyinfo = 
11c30 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
11c40 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
11c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
11c60 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
11c70 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
11c80 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
11c90 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
11ca0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11cb0 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
11cc0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
11cd0 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20   nColumn+1, 0,. 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e     (char*)pKeyin
11d00 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
11d10 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43  ANDOFF);.  VdbeC
11d20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
11d30 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
11d40 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
11d50 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
11d60 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
11d70 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
11d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d90 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
11da0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
11db0 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
11dc0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11dd0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
11de0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
11df0 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
11e00 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
11e10 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
11e20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11e30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
11e40 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
11e50 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
11e60 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
11e70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11e80 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
11e90 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ULT);.  sqlite3V
11ea0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11eb0 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
11ec0 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
11ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11ee0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
11ef0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
11f00 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
11f10 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11f20 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
11f30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11f40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
11f50 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
11f60 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
11f70 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
11f80 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
11f90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11fa0 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
11fb0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
11fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11fd0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
11fe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11ff0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12000 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
12010 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
12020 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12030 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
12040 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
12050 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12060 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
12070 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
12080 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
12090 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
120a0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
120b0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
120c0 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
120d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
120e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
120f0 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
12100 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
12110 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75  rse,.  WhereClau
12120 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63  se *pWC,.  struc
12130 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12140 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74  pSrc,.  ExprList
12150 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20   *pOrderBy.){.  
12160 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
12170 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20  nTerm;.  struct 
12180 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12190 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
121a0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
121b0 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
121c0 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b  by *pIdxOrderBy;
121d0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
121e0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
121f0 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
12200 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
12210 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  Term;.  int nOrd
12220 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erBy;.  sqlite3_
12230 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
12240 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 57 48 45 52 45  Info;..  /*WHERE
12250 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74  TRACE(("Recomput
12260 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66  ing index info f
12270 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72  or %s...\n", pSr
12280 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  c->pTab->zName))
12290 3b 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  ;*/..  /* Count 
122a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
122b0 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
122c0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
122d0 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
122e0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
122f0 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
12300 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
12310 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
12320 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
12330 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
12340 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
12350 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
12360 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
12370 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
12380 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
12390 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
123a0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
123b0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
123c0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
123d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
123e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
123f0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
12400 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
12410 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
12420 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
12430 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
12440 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
12450 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
12460 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
12470 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
12480 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
12490 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
124a0 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
124b0 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
124c0 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
124d0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
124e0 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
124f0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
12500 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12510 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
12520 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
12530 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
12540 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
12550 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
12560 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
12570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
12580 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
12590 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
125a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
125b0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
125c0 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
125d0 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
125e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
125f0 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
12600 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
12610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12620 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
12630 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12640 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
12650 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
12660 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
12670 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
12680 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
126b0 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
126c0 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
126d0 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
12700 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
12710 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
12720 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
12730 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12740 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
12750 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a  memory");.    /*
12760 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61   (double)0 In ca
12770 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
12780 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
12790 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ... */.    retur
127a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
127b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
127c0 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
127d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
127e0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
127f0 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
12800 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
12810 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
12820 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
12830 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
12840 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
12850 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
12860 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
12870 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
12880 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
12890 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
128a0 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
128b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
128c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
128d0 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
128e0 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
128f0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12900 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
12910 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
12920 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
12930 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12940 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
12950 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
12960 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
12970 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
12980 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
12990 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
129a0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
129b0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
129c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
129d0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
129e0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
129f0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
12a00 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
12a10 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
12a20 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
12a30 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
12a40 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
12a50 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12a60 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
12a70 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
12a80 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12a90 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
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 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
12ae0 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
12af0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
12b00 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
12b10 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
12b20 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
12b30 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
12b40 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
12b50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
12b60 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
12b70 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
12b80 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
12b90 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
12ba0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12bb0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
12bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
12bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
12be0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
12bf0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
12c00 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
12c10 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12c20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
12c30 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
12c40 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
12c50 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
12c60 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
12c70 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
12c80 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65   pIdxCons[j].iTe
12c90 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  rmOffset = i;.  
12ca0 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d    op = (u8)pTerm
12cb0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
12cc0 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70  _ALL;.    if( op
12cd0 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57  ==WO_IN ) op = W
12ce0 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f  O_EQ;.    pIdxCo
12cf0 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20  ns[j].op = op;. 
12d00 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
12d10 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
12d20 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
12d30 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
12d40 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
12d50 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
12d60 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12d70 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
12d80 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
12d90 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
12da0 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
12db0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
12dc0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
12dd0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
12de0 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
12df0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
12e00 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
12e10 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
12e20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
12e30 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
12e40 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
12e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
12e60 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
12e70 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
12e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
12e90 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
12ea0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
12eb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
12ec0 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
12ed0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12ee0 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
12ef0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
12f00 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
12f10 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
12f20 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
12f30 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a  _MATCH) );.    j
12f40 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
12f50 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
12f60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
12f70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
12f80 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12f90 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
12fa0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
12fb0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
12fc0 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
12fd0 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
12fe0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
12ff0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  }..  return pIdx
13000 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
13010 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
13020 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
13030 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
13040 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
13050 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
13060 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
13070 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
13080 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
13090 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
130a0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
130b0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
130c0 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
130d0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f  e3_index_info po
130e0 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  inter passed.** 
130f0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  as the argument.
13100 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
13110 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
13120 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
13130 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
13140 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
13150 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
13160 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
13170 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
13180 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
13190 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
131a0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
131b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
131c0 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
131d0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
131e0 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
131f0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
13200 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
13210 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
13220 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
13230 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
13240 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
13250 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
13260 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
13270 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
13280 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
13290 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
132a0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
132b0 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
132c0 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
132d0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
132e0 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
132f0 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
13300 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
13310 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
13320 72 63 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52  rc;..  /*WHERETR
13330 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78  ACE(("xBestIndex
13340 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62   for %s\n", pTab
13350 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a 20 20 54  ->zName));*/.  T
13360 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
13370 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
13380 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
13390 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
133a0 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
133b0 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
133c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
133d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
133e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
133f0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
13400 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
13410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
13420 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
13430 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13440 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13450 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
13460 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65  Str(rc));.    }e
13470 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13480 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13490 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e  e, "%s", pVtab->
134a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
134b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
134c0 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
134d0 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  g);.  pVtab->zEr
134e0 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  rMsg = 0;..  for
134f0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
13500 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
13510 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74    if( !p->aConst
13520 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
13530 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  && p->aConstrain
13540 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
13550 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
13560 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13570 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
13580 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
13590 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
135a0 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
135b0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
135c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
135d0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
135e0 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  r;.}.#endif /* !
135f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13600 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13610 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51  ) */...#ifdef SQ
13620 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13630 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  3./*.** Estimate
13640 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
13650 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
13660 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
13670 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
13680 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
13690 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
136a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
136b0 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
136c0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
136d0 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56  ows less than pV
136e0 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  al.**    aStat[1
136f0 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
13700 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
13710 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52   to pVal.**.** R
13720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13730 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
13740 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b  tatic int whereK
13750 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
13760 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13770 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13780 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13790 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137b0 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
137c0 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
137d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
137e0 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f   *pVal,        /
137f0 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69  * Value to consi
13800 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
13810 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
13820 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
13830 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
13840 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
13850 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
13860 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
13870 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
13880 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
13890 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20  .  tRowcnt n;.  
138a0 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
138b0 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65  mple;.  int i, e
138c0 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71  Type;.  int isEq
138d0 20 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20   = 0;.  i64 v;. 
138e0 20 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a   double r, rS;..
138f0 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55    assert( roundU
13900 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d  p==0 || roundUp=
13910 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
13920 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
13930 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30  );.  if( pVal==0
13940 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13950 5f 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49  _ERROR;.  n = pI
13960 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  dx->aiRowEst[0];
13970 0a 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  aSample = pId
13980 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54  x->aSample;.  eT
13990 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
139a0 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a  lue_type(pVal);.
139b0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
139c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
139d0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f      v = sqlite3_
139e0 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
139f0 29 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29  );.    r = (i64)
13a00 76 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  v;.    for(i=0; 
13a10 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  i<pIdx->nSample;
13a20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
13a30 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13a40 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
13a50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13a60 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
13a70 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
13a80 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  XT ) break;.    
13a90 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
13aa0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  .eType==SQLITE_I
13ab0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
13ac0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
13ad0 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20  .u.i>=v ){.     
13ae0 20 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d       isEq = aSam
13af0 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20  ple[i].u.i==v;. 
13b00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13b30 73 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69  ssert( aSample[i
13b40 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
13b50 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20  FLOAT );.       
13b60 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
13b70 75 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20  u.r>=r ){.      
13b80 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
13b90 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20  le[i].u.r==r;.  
13ba0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13bc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
13bd0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
13be0 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20  _FLOAT ){.    r 
13bf0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13c00 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20  double(pVal);.  
13c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
13c20 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
13c30 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  {.      if( aSam
13c40 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
13c50 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74  LITE_NULL ) cont
13c60 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
13c70 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
13c80 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20  >=SQLITE_TEXT ) 
13c90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
13ca0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13cb0 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
13cc0 29 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20  ){.        rS = 
13cd0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a  aSample[i].u.r;.
13ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13cf0 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
13d00 65 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20  e[i].u.i;.      
13d10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d  }.      if( rS>=
13d20 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45  r ){.        isE
13d30 71 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20  q = rS==r;.     
13d40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13d50 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
13d60 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
13d70 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20  E_NULL ){.    i 
13d80 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61  = 0;.    if( aSa
13d90 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53  mple[0].eType==S
13da0 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45  QLITE_NULL ) isE
13db0 71 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 1;.  }else{.
13dc0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
13dd0 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e==SQLITE_TEXT |
13de0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
13df0 42 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28  BLOB );.    for(
13e00 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
13e10 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
13e20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
13e30 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54  .eType==SQLITE_T
13e40 45 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69  EXT || aSample[i
13e50 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
13e60 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
13e70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13e80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
13e90 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20  Idx->nSample ){ 
13ea0 20 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69       .      sqli
13eb0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13ec0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ->db;.      Coll
13ed0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
13ee0 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20    const u8 *z;. 
13ef0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
13f00 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
13f10 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
13f20 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76  t u8 *)sqlite3_v
13f30 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b  alue_blob(pVal);
13f40 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
13f50 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
13f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13f70 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pColl->enc==SQLI
13f80 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
13f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13fa0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
13fb0 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
13fc0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
13fd0 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29  , *pIdx->azColl)
13fe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
13ff0 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
14000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14010 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
14020 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28   }.        z = (
14030 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
14040 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
14050 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
14060 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b         if( !z ){
14070 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
14080 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
140a0 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70    assert( z && p
140b0 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
140c0 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cmp );.      }. 
140d0 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
140e0 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c  ValueBytes(pVal,
140f0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
14100 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70  .      for(; i<p
14110 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
14120 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
14130 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
14140 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61  Sampletype = aSa
14150 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20  mple[i].eType;. 
14160 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70         if( eSamp
14170 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63  letype<eType ) c
14180 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14190 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
141a0 21 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b  !=eType ) break;
141b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
141c0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
141d0 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e     if( pColl->en
141e0 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c!=SQLITE_UTF8 )
141f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
14200 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20  nSample;.       
14210 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65     char *zSample
14220 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f   = sqlite3Utf8to
14230 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  16(.            
14240 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63    db, pColl->enc
14250 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
14260 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79  , aSample[i].nBy
14270 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20  te, &nSample.   
14280 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
14290 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65      if( !zSample
142a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
142b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
142c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
142d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
142e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
142f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14300 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
14310 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
14320 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c   nSample, zSampl
14330 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e, n, z);.      
14340 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14350 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a  e(db, zSample);.
14360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
14370 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
14380 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
14390 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
143a0 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69  pUser, aSample[i
143b0 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65  ].nByte, aSample
143c0 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a  [i].u.z, n, z);.
143d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143e0 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20    if( c>=0 ){.  
143f0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
14400 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20   ) isEq = 1;.   
14410 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14440 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
14450 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
14460 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68   first sample th
14470 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
14480 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c  an.  ** or equal
14490 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66   to pVal.  Or if
144a0 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
144b0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70  e, then all samp
144c0 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a  les are less.  *
144d0 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66  * than pVal.  If
144e0 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61   aSample[i]==pVa
144f0 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e  l, then isEq==1.
14500 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71  .  */.  if( isEq
14510 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14520 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
14530 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  );.    aStat[0] 
14540 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  = aSample[i].nLt
14550 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
14560 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b   aSample[i].nEq;
14570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
14580 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55  owcnt iLower, iU
14590 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
145a0 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
145b0 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
145c0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
145d0 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[0].nLt;.   
145e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
145f0 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
14600 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53  nSample ? n : aS
14610 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
14620 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
14630 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20  mple[i-1].nEq + 
14640 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74  aSample[i-1].nLt
14650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
14660 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67  t[1] = pIdx->avg
14670 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77  Eq;.    if( iLow
14680 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
14690 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
146a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
146b0 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
146c0 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
146d0 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
146e0 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
146f0 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
14700 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
14710 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
14720 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
14730 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d  ower + iGap;.  }
14740 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14750 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
14760 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14770 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  TAT3 */../*.** I
14780 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
14790 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  pr represents a 
147a0 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73  literal value, s
147b0 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
147c0 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33  to.** an sqlite3
147d0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
147e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
147f0 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68  same value, with
14800 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66   affinity.** aff
14810 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
14820 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14830 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14840 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14850 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  e .** caller to 
14860 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14870 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  se this structur
14880 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20  e by passing it 
14890 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61  to .** sqlite3Va
148a0 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  lueFree()..**.**
148b0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
148c0 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d  parse is a recom
148d0 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70  pile (sqlite3Rep
148e0 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45  repare()) and pE
148f0 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c  xpr.** is an SQL
14900 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63   variable that c
14910 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e  urrently has a n
14920 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f  on-NULL value bo
14930 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72  und to it,.** cr
14940 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  eate an sqlite3_
14950 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
14960 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
14970 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74  value, again wit
14980 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66  h.** affinity af
14990 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
149a0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
149b0 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68  If neither of th
149c0 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73  e above apply, s
149d0 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a  et *pp to NULL..
149e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
149f0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
14a00 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
14a10 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
14a20 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  E_OK..*/.#ifdef 
14a30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14a40 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76  AT3.static int v
14a50 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20  alueFromExpr(.  
14a60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
14a70 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a    Expr *pExpr, .
14a80 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c    u8 aff, .  sql
14a90 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a  ite3_value **pp.
14aa0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
14ab0 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a  op==TK_VARIABLE.
14ac0 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
14ad0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
14ae0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
14af0 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20  VARIABLE).  ){. 
14b00 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45     int iVar = pE
14b10 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
14b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14b30 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
14b40 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
14b50 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56    *pp = sqlite3V
14b60 64 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72  dbeGetValue(pPar
14b70 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
14b80 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  iVar, aff);.    
14b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14ba0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
14bb0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
14bc0 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
14bd0 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54  pExpr, SQLITE_UT
14be0 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a  F8, aff, pp);.}.
14bf0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
14c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
14c10 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
14c20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
14c30 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
14c40 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
14c50 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
14c60 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
14c70 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
14c80 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
14c90 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
14ca0 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
14cb0 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
14cc0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
14cd0 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
14ce0 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
14cf0 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
14d00 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
14d10 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
14d20 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
14d30 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
14d40 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
14d50 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
14d60 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
14d70 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
14d80 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
14da0 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
14db0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14dc0 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
14dd0 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
14de0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
14df0 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
14e00 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
14e10 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
14e20 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
14e30 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
14e40 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
14e50 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
14e60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
14e70 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
14e80 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20  e nEq parameter 
14e90 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e  is passed the in
14ea0 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78  dex of the index
14eb0 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
14ec0 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20  to the.** range 
14ed0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
14ee0 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
14ef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61  e number of equa
14f00 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
14f10 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  .** optimized by
14f20 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
14f30 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
14f40 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
14f50 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e  index p is.** on
14f60 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
14f70 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
14f80 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
14f90 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
14fa0 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
14fb0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
14fc0 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
14fd0 65 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  e passed the val
14fe0 75 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  ue 1 (as the ran
14ff0 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
15000 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74  lumn,.** b, is t
15010 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d  he second left-m
15020 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
15030 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
15040 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
15050 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
15060 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
15070 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
15080 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
15090 6c 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a  ld be passed 0..
150a0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
150b0 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  ed value is an i
150c0 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74  nteger divisor t
150d0 6f 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74  o reduce the est
150e0 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68  imated.** search
150f0 20 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72   space.  A retur
15100 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61  n value of 1 mea
15110 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f  ns that range co
15120 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
15130 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e   no help at all.
15140 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
15150 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67   of 2 means rang
15160 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
15170 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f  e.** expected to
15180 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
15190 63 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66  ch space by half
151a0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
151b0 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ...**.** In the 
151c0 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
151d0 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20  e_stat3 ANALYZE 
151e0 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65  data, each range
151f0 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72   inequality.** r
15200 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
15210 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
15220 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65  tor of 4.  Hence
15230 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   a single constr
15240 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65  aint (x>?).** re
15250 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72  sults in a retur
15260 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e  n of 4 and a ran
15270 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  ge constraint (x
15280 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75  >? AND x<?) resu
15290 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75  lts.** in a retu
152a0 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61  rn of 16..*/.sta
152b0 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
152c0 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
152d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
152e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
152f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
15300 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
15310 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15320 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f   /* The index co
15330 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e  ntaining the ran
15340 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
15350 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74  mn; "x" */.  int
15360 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   nEq,           
15370 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    /* index into 
15380 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65  p->aCol[] of the
15390 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
153a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
153b0 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
153c0 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
153d0 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
153e0 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
153f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
15400 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
15410 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
15420 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
15430 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
15440 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f   be NULL */.  do
15450 75 62 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20  uble *pRangeDiv 
15460 20 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65    /* OUT: Reduce
15470 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
15480 20 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f   this divisor */
15490 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
154a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
154b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
154c0 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71  STAT3..  if( nEq
154d0 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c  ==0 && p->nSampl
154e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
154f0 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61  _value *pRangeVa
15500 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  l;.    tRowcnt i
15510 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74  Lower = 0;.    t
15520 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20  Rowcnt iUpper = 
15530 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
15540 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
15550 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70  ;.    u8 aff = p
15560 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
15570 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
15580 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66  ffinity;..    if
15590 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
155a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
155b0 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
155c0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
155d0 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
155e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
155f0 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
15600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
15610 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
15620 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
15630 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
15640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15650 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
15660 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
15670 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30   p, pRangeVal, 0
15680 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
15690 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
156a0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
156b0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
156c0 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
156d0 20 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f   WO_GT)!=0 ) iLo
156e0 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  wer += a[1];.   
156f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15700 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
15710 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
15720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15730 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b  _OK && pUpper ){
15740 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15750 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
15760 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
15770 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
15780 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
15790 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
157a0 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
157b0 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
157c0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
157d0 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
157e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
157f0 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20  TE_OK.       && 
15800 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
15810 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56  arse, p, pRangeV
15820 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54  al, 1, a)==SQLIT
15830 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
15840 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
15850 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
15860 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
15870 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
15880 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d  ) iUpper += a[1]
15890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
158a0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
158b0 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
158c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
158d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
158e0 20 20 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c    if( iUpper<=iL
158f0 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
15900 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
15910 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74  uble)p->aiRowEst
15920 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
15930 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67  {.        *pRang
15940 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70  eDiv = (double)p
15950 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64  ->aiRowEst[0]/(d
15960 6f 75 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20  ouble)(iUpper - 
15970 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
15980 0a 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52  .      /*WHERETR
15990 41 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e  ACE(("range scan
159a0 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
159b0 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20    div=%g\n",.   
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
159d0 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
159e0 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65  )iUpper, *pRange
159f0 44 69 76 29 29 3b 2a 2f 0a 20 20 20 20 20 20 72  Div));*/.      r
15a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
15a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15a30 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
15a40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15a50 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
15a60 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
15a70 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
15a80 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
15a90 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d  ;.  *pRangeDiv =
15aa0 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66   (double)1;.  if
15ab0 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
15ac0 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
15ad0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20  ERM_VNULL)==0 ) 
15ae0 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
15af0 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70  ouble)4;.  if( p
15b00 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44  Upper ) *pRangeD
15b10 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
15b20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15b40 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
15b50 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
15b60 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
15b70 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
15b80 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
15b90 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
15ba0 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
15bb0 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
15bc0 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
15bd0 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
15be0 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
15bf0 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
15c00 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
15c10 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
15c20 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
15c30 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
15c40 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
15c50 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
15c60 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
15c70 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
15c80 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
15c90 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
15ca0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
15cb0 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
15cc0 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
15cd0 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
15ce0 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
15cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
15d00 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
15d10 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
15d20 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
15d30 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
15d40 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
15d50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15d60 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
15d70 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
15d80 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
15d90 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
15da0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
15db0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
15dc0 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
15dd0 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
15de0 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
15df0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
15e00 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
15e10 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
15e20 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
15e30 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
15e40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
15e50 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
15e60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15e70 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15e80 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
15e90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15ea0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15eb0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
15ec0 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
15ed0 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
15ee0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  m */.  Expr *pEx
15ef0 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
15f00 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
15f10 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
15f20 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
15f30 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
15f40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
15f50 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
15f60 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
15f70 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
15f80 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20  alue *pRhs = 0; 
15f90 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67   /* VALUE on rig
15fa0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
15fb0 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66  pTerm */.  u8 af
15fc0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
15fd0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
15fe0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
15ff0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16000 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
16010 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
16020 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
16030 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
16040 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
16050 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
16060 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
16070 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
16080 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20  le>0 );.  aff = 
16090 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
160a0 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e  p->aiColumn[0]].
160b0 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
160c0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20  pExpr ){.    rc 
160d0 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
160e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
160f0 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20  ff, &pRhs);.    
16100 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
16110 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
16120 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b  cancel;.  }else{
16130 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69  .    pRhs = sqli
16140 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72  te3ValueNew(pPar
16150 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69  se->db);.  }.  i
16160 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74  f( pRhs==0 ) ret
16170 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
16180 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  UND;.  rc = wher
16190 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
161a0 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29  , p, pRhs, 0, a)
161b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
161c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 57  TE_OK ){.    /*W
161d0 48 45 52 45 54 52 41 43 45 28 28 22 65 71 75 61  HERETRACE(("equa
161e0 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
161f0 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
16200 5b 31 5d 29 29 3b 2a 2f 0a 20 20 20 20 2a 70 6e  [1]));*/.    *pn
16210 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a  Row = a[1];.  }.
16220 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
16230 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69  t_cancel:.  sqli
16240 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 68  te3ValueFree(pRh
16250 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  s);.  return rc;
16260 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
16270 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
16280 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69  LE_STAT3) */..#i
16290 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
162a0 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45  LE_STAT3./*.** E
162b0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
162c0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
162d0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
162e0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
162f0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
16300 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
16310 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
16320 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
16330 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
16340 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
16350 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
16360 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
16370 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
16380 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
16390 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
163a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
163b0 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
163c0 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
163d0 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
163e0 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
163f0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
16400 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
16410 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
16420 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
16430 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
16440 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
16450 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
16460 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
16470 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
16480 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
16490 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
164a0 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
164b0 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
164c0 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
164d0 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
164e0 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
164f0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
16500 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
16510 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
16520 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
16530 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
16540 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
16550 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
16560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16570 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
16580 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
16590 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c  pTerm */.  ExprL
165a0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
165b0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
165c0 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
165d0 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
165e0 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c  ...)" */.  doubl
165f0 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
16600 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
16610 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
16620 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
16630 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16640 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
16650 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
16660 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c   code */.  doubl
16670 65 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  e nEst;         
16680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16690 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
166a0 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
166b0 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d  double nRowEst =
166c0 20 28 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e   (double)0; /* N
166d0 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
166e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
166f0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16720 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
16730 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
16740 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
16750 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
16760 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
16770 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
16780 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
16790 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
167a0 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
167b0 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  , p, pList->a[i]
167c0 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
167d0 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
167e0 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  Est;.  }.  if( r
167f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16800 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
16810 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  > p->aiRowEst[0]
16820 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e   ) nRowEst = p->
16830 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
16840 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
16850 74 3b 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52  t;.    /*WHERETR
16860 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74  ACE(("IN row est
16870 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
16880 2c 20 6e 52 6f 77 45 73 74 29 29 3b 2a 2f 0a 20  , nRowEst));*/. 
16890 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
168a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
168b0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
168c0 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a  E_STAT3) */../*.
168d0 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
168e0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
168f0 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
16900 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
16910 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
16920 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
16930 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
16940 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
16950 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
16960 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
16970 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
16980 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
16990 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
169a0 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
169b0 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
169c0 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
169d0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
169e0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
169f0 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
16a00 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
16a10 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
16a20 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
16a30 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
16a40 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
16a50 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
16a60 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
16a70 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
16a80 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
16a90 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
16aa0 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
16ab0 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
16ac0 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
16ad0 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
16ae0 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
16af0 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
16b00 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
16b10 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
16b20 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
16b30 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
16b40 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
16b50 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
16b60 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38  N-OF: R-24597-58
16b70 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65  655 No tests are
16b80 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20   done for terms 
16b90 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70  that are.** comp
16ba0 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64  letely satisfied
16bb0 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a   by indices..**.
16bc0 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
16bd0 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
16be0 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
16bf0 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
16c00 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
16c10 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
16c20 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
16c30 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
16c40 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
16c50 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
16c60 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
16c70 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
16c80 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
16c90 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
16ca0 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
16cb0 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
16cc0 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
16cd0 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
16ce0 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
16cf0 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
16d00 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
16d10 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
16d20 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
16d30 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
16d40 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
16d50 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
16d60 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
16d70 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
16d80 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
16d90 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
16da0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
16db0 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
16dc0 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
16dd0 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
16de0 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
16df0 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
16e00 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
16e10 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
16e20 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
16e30 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
16e40 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
16e50 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
16e60 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
16e70 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
16e80 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
16e90 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
16ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
16eb0 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
16ec0 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
16ed0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
16ee0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
16ef0 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
16f00 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
16f10 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
16f20 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
16f30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16f40 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
16f50 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
16f60 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
16f70 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
16f80 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
16f90 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
16fa0 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
16fb0 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
16fc0 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
16fd0 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
16fe0 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
16ff0 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
17000 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
17010 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
17020 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
17030 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
17040 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
17050 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
17060 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
17070 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
17080 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
17090 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
170a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
170b0 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
170c0 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
170d0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
170e0 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
170f0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
17100 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
17110 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
17120 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
17130 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
17140 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17150 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
17160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17170 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17180 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
17190 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
171a0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
171b0 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
171c0 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
171d0 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
171e0 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
171f0 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
17200 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
17210 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
17220 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
17230 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
17240 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
17250 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
17260 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
17270 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
17280 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
17290 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
172a0 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
172b0 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
172c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
172d0 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
172e0 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
172f0 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
17300 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17320 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
17330 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
17340 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
17350 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
17360 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17370 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
17380 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
17390 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
173a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
173b0 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
173c0 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
173d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
173e0 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
173f0 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
17400 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
17410 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
17420 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
17430 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
17440 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
17450 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
17460 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
17470 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
17480 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
17490 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
174a0 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
174b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
174c0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
174d0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
174e0 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
174f0 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
17500 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
17510 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
17520 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
17530 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
17540 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
17550 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
17560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
17570 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
17580 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
175a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
175b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
175c0 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
175d0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
175e0 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
175f0 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
17600 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68  l *pLevel, /* Th
17610 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  e level of the F
17620 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
17630 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
17640 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20    int iEq,      
17650 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17660 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  f the equality t
17670 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20  erm within this 
17680 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
17690 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Rev,           /
176a0 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65 72  * True for rever
176b0 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72  se-order IN oper
176c0 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
176d0 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
176e0 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
176f0 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
17700 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
17710 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
17720 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
17730 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
17740 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
17750 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
17760 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
17770 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
17780 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
17790 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
177a0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
177b0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
177c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
177d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
177e0 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
177f0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
17800 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
17810 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
17820 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
17830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17840 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
17850 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
17860 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
17880 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
17890 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
178a0 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
178b0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
178c0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
178d0 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28  Loop;..    if( (
178e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
178f0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
17900 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  BLE)==0.      &&
17910 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17920 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20  pIndex!=0.      
17930 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
17940 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  e.pIndex->aSortO
17950 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b  rder[iEq].    ){
17960 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17970 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20   iEq==0 );.     
17980 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
17990 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
179a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 20 29  Idx->nColumn-1 )
179b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
179c0 28 20 69 45 71 3e 30 20 26 26 20 69 45 71 2b 31  ( iEq>0 && iEq+1
179d0 3c 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e  <pLevel->plan.u.
179e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
179f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17a00 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
17a10 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
17a20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
17a30 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
17a40 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
17a50 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
17a60 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
17a70 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
17a80 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
17a90 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
17aa0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
17ab0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
17ac0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
17ad0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
17ae0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
17af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17b00 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
17b10 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
17b20 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
17b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
17b40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
17b50 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
17b60 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
17b70 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
17b80 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
17b90 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
17ba0 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
17bb0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
17bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17bd0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
17be0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
17bf0 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
17c00 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
17c10 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
17c20 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
17c30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
17c40 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
17c50 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
17c80 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
17c90 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
17ca0 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
17cb0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
17cc0 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
17cd0 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
17ce0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
17cf0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
17d00 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
17d10 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
17d20 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
17d30 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
17d40 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
17d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17d60 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
17d70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
17d80 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
17d90 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
17da0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17db0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
17dc0 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
17dd0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
17de0 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
17df0 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
17e00 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
17e10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17e20 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
17e30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17e40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
17e50 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
17e60 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
17e70 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
17e80 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
17e90 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
17ea0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17eb0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
17ec0 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
17ed0 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
17ee0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
17ef0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
17f00 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
17f10 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
17f20 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
17f30 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
17f40 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
17f50 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
17f60 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
17f70 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
17f80 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
17f90 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
17fa0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
17fb0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
17fc0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
17fd0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
17fe0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
17ff0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
18000 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
18010 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
18020 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
18030 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
18040 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
18050 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
18060 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
18070 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
18080 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
18090 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
180a0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
180b0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
180c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
180d0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
180e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
180f0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
18100 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
18110 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
18120 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
18130 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
18140 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
18150 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
18160 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
18170 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
18180 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
18190 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
181a0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
181b0 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
181c0 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
181d0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
181e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
181f0 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
18200 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
18210 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e   cell and return
18220 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
18230 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
18240 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ll. The code tha
18250 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
18260 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
18270 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
18280 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  l to store the t
18290 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
182a0 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
182b0 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
182c0 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
182d0 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
182e0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
182f0 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
18300 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
18310 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
18320 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
18330 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
18340 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
18350 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
18360 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
18370 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
18380 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
18390 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
183a0 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
183b0 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
183c0 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
183d0 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
183e0 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
183f0 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
18400 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
18410 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
18420 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
18430 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
18440 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
18450 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
18460 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
18470 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
18480 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
18490 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
184a0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
184b0 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
184c0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
184d0 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
184e0 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
184f0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
18500 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
18510 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
18520 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
18530 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
18540 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
18550 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
18560 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
18570 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
18580 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
18590 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
185a0 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
185b0 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
185c0 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
185d0 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
185e0 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
185f0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
18600 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
18610 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
18620 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
18630 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
18640 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
18650 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
18660 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
18670 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
18680 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
18690 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
186a0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
186b0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
186c0 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
186d0 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
186e0 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
186f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18700 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
18710 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18720 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
18730 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
18740 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
18750 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
18760 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  coded */.  int b
18770 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
18780 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
18790 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
187a0 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
187b0 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
187c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
187d0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
187e0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
187f0 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
18800 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
18810 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
18820 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
18830 29 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  ){.  int nEq;   
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
18860 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
18870 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
18880 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
18890 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
188a0 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e      /* The vm un
188b0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
188c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
188d0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
188e0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
188f0 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
18900 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57  this loop */.  W
18910 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18930 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
18940 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68  int term */.  Wh
18950 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
18960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18970 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
18980 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  ect */.  int j; 
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
189b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
189c0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
189d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
189e0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
189f0 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a10 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
18a20 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
18a30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
18a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18a50 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
18a60 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  string to return
18a70 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
18a80 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
18a90 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
18aa0 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
18ab0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f  index. */.  pLoo
18ac0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
18ad0 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  op;.  assert( (p
18ae0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18af0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
18b00 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20  LE)==0 );.  nEq 
18b10 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
18b20 2e 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70  .nEq;.  pIdx = p
18b30 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
18b40 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ndex;.  assert( 
18b50 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pIdx!=0 );..  /*
18b60 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
18b70 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
18b80 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
18b90 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
18ba0 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73  m..  */.  regBas
18bb0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
18bc0 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70   + 1;.  nReg = p
18bd0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
18be0 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20  q + nExtraReg;. 
18bf0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
18c00 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d   nReg;..  zAff =
18c10 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
18c20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c  (pParse->db, sql
18c30 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
18c40 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a  yStr(v, pIdx));.
18c50 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20    if( !zAff ){. 
18c60 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
18c70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
18c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75  .  }..  /* Evalu
18c90 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
18ca0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
18cb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
18cc0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29  ->nColumn>=nEq )
18cd0 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e  ;.  for(j=0; j<n
18ce0 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
18cf0 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20  t r1;.    pTerm 
18d00 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a  = pLoop->aTerm[j
18d10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
18d20 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
18d30 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18d40 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
18d50 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
18d60 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
18d70 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
18d80 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
18d90 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
18da0 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
18db0 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
18dc0 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
18dd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
18de0 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
18df0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
18e00 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18e10 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
18e20 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
18e30 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  */.    r1 = code
18e40 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
18e50 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
18e60 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67  el, j, bRev, reg
18e70 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
18e80 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
18e90 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
18ea0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
18eb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18ec0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18ed0 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
18ee0 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
18ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f10 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
18f20 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
18f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18f40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
18f50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
18f60 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
18f70 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
18f80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
18f90 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
18fa0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
18fb0 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
18fc0 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
18fd0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
18fe0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
18ff0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
19000 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
19010 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
19020 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
19030 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
19040 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b       if( zAff ){
19050 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
19060 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
19070 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
19080 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  [j])==SQLITE_AFF
19090 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
190a0 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
190b0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
190c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
190d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
190e0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
190f0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66  ange(pRight, zAf
19100 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  f[j]) ){.       
19110 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
19120 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
19130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41      }.  }.  *pzA
19150 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74  ff = zAff;.  ret
19160 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a  urn regBase;.}..
19170 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19180 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
19190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
191a0 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65  s a helper for e
191b0 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
191c0 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70  () below.**.** p
191d0 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65  Str holds the te
191e0 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  xt of an express
191f0 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20  ion that we are 
19200 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20  building up one 
19210 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d  term.** at a tim
19220 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
19230 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d   adds a new term
19240 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
19250 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
19260 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61  * Terms are sepa
19270 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20  rated by AND so 
19280 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65  add the "AND" te
19290 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e  xt for second an
192a0 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  d subsequent.** 
192b0 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  terms only..*/.s
192c0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
192d0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  inAppendTerm(.  
192e0 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20  StrAccum *pStr, 
192f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19300 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69  he text expressi
19310 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a  on being built *
19320 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20  /.  int iTerm,  
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73  /* Index of this
19350 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73   term.  First is
19360 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   zero */.  const
19370 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
19380 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19390 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
193a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
193b0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p             /*
193c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
193d0 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  rator */.){.  if
193e0 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65  ( iTerm ) sqlite
193f0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
19400 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35  pStr, " AND ", 5
19410 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
19420 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
19430 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20   zColumn, -1);. 
19440 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
19450 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
19460 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
19470 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
19480 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
19490 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
194a0 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
194b0 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
194c0 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
194d0 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
194e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
194f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
19500 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ing buffer conta
19510 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74  ining a descript
19520 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ion.** of the su
19530 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f  bset of table ro
19540 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
19550 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
19560 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20  e form of an.** 
19570 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  SQL expression. 
19580 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  Or, if all rows 
19590 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c  are scanned, NUL
195a0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
195b0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
195c0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a  , if the query:.
195d0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
195e0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
195f0 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a  =1 AND b>2;.**.*
19600 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65  * is run and the
19610 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
19620 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74  n (a, b), then t
19630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19640 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67  urns a.** string
19650 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
19660 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e  **   "a=? AND b>
19670 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  ?".**.** The ret
19680 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  urned pointer po
19690 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ints to memory o
196a0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
196b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a  ite3DbMalloc()..
196c0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
196d0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
196e0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
196f0 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65  e the buffer whe
19700 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  n it is.** no lo
19710 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
19720 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
19730 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
19740 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
19750 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
19760 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
19770 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
19780 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19790 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
197a0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
197b0 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20  e.nEq;.  int i, 
197c0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
197d0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
197e0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20    int *aiColumn 
197f0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
19800 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74  mn;.  StrAccum t
19810 78 74 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  xt;..  if( pInde
19820 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
19830 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
19840 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
19850 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
19860 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
19870 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MIT))==0 ){.    
19880 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19890 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
198a0 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20  nit(&txt, 0, 0, 
198b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
198c0 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64  H);.  txt.db = d
198d0 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  b;.  sqlite3StrA
198e0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
198f0 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72   " (", 2);.  for
19900 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b  (i=0; i<nEq; i++
19910 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  ){.    explainAp
19920 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
19930 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
19940 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b  i]].zName, "=");
19950 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
19960 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19970 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
19980 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
19990 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
199a0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f  >nColumn ) ? "ro
199b0 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
199c0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
199d0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
199e0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
199f0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
19a00 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
19a10 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
19a20 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
19a30 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
19a40 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
19a50 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
19a60 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
19a70 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
19a80 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
19a90 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
19aa0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
19ab0 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
19ac0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
19ad0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
19ae0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
19af0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19b00 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
19b10 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
19b20 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
19b30 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
19b40 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
19b50 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
19b60 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
19b70 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
19b80 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
19b90 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
19ba0 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
19bb0 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
19bc0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
19bd0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
19be0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
19bf0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
19c00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
19c20 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
19c30 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
19c40 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
19c50 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
19c60 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
19c70 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
19c80 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
19c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
19ca0 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
19cb0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
19cc0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
19cf0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
19d00 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
19d10 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
19d40 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
19d50 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
19d60 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
19d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
19d80 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
19d90 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
19da0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
19db0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
19dc0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
19dd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19de0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
19df0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
19e00 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
19e10 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
19e20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63     /* VM being c
19e30 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20  onstructed */.  
19e40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19e50 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
19e60 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
19e70 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
19e80 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  zMsg;           
19e90 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
19ea0 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75  to add to EQP ou
19eb0 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  tput */.    sqli
19ec0 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20  te3_int64 nRow; 
19ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
19ee0 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
19ef0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
19f00 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  scan */.    int 
19f10 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
19f20 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
19f30 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
19f40 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
19f50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
19f60 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
19f70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
19f80 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
19f90 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
19fa0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
19fb0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
19fc0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
19fd0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
19fe0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
19ff0 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
1a000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1a010 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
1a020 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20   this loop */.. 
1a030 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
1a040 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66  l->pWLoop;.    f
1a050 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  lags = pLoop->ws
1a060 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28  Flags;.    if( (
1a070 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
1a080 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
1a090 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
1a0a0 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75  BLE_ONLY) ) retu
1a0b0 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63  rn;..    isSearc
1a0c0 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52  h = (flags&(WHER
1a0d0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1a0e0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1a100 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49  ((flags&WHERE_VI
1a110 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26  RTUALTABLE)==0 &
1a120 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  & (pLoop->u.btre
1a130 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20  e.nEq>0)).      
1a140 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
1a150 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
1a160 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
1a170 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20  DERBY_MAX));..  
1a180 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1a190 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
1a1a0 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52  , isSearch?"SEAR
1a1b0 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20  CH":"SCAN");.   
1a1c0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1a1d0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ect ){.      zMs
1a1e0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1a1f0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1a200 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
1a210 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c  zMsg,pItem->iSel
1a220 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ectId);.    }els
1a230 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  e{.      zMsg = 
1a240 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1a250 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41  db, zMsg, "%s TA
1a260 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  BLE %s", zMsg, p
1a270 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1a280 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
1a290 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1a2a0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1a2b0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1a2c0 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
1a2d0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
1a2e0 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lias);.    }.   
1a2f0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57   if( (flags & (W
1a300 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56  HERE_IPK|WHERE_V
1a310 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30  IRTUALTABLE))==0
1a320 0a 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e  .     && pLoop->
1a330 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1a340 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  0.    ){.      c
1a350 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78  har *zWhere = ex
1a360 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1a370 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  db, pLoop, pItem
1a380 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
1a390 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1a3a0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1a3b0 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e  "%s USING %s%sIN
1a3c0 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67  DEX%s%s%s", zMsg
1a3d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  , .          ((f
1a3e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
1a3f0 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41  P_INDEX)?"AUTOMA
1a400 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  TIC ":""),.     
1a410 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1a420 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22  HERE_IDX_ONLY)?"
1a430 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a  COVERING ":""),.
1a440 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
1a450 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
1a460 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20  NDEX)?"":" "),. 
1a470 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1a480 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1a490 44 45 58 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e  DEX)?"": pLoop->
1a4a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1a4b0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
1a4c0 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29    zWhere.      )
1a4d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1a4e0 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
1a4f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a500 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1a510 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
1a520 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1a530 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  D)!=0 ){.      z
1a540 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1a550 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1a560 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45  "%s USING INTEGE
1a570 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  R PRIMARY KEY", 
1a580 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66  zMsg);..      if
1a590 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 43 4f  ( flags&WHERE_CO
1a5a0 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20  LUMN_EQ ){.     
1a5b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1a5c0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1a5d0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
1a5e0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1a5f0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1a600 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
1a610 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
1a620 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1a630 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1a640 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1a650 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
1a660 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
1a670 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
1a680 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1a690 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1a6a0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1a6b0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1a6c0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1a6d0 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
1a6e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
1a6f0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
1a700 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
1a710 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1a720 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1a730 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
1a740 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
1a750 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1a760 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1a770 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
1a780 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
1a790 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1a7a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1a7b0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1a7c0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1a7d0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1a7e0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
1a7f0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1a800 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
1a810 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70  ab.idxNum, pLoop
1a820 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
1a830 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1a840 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
1a850 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
1a860 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
1a870 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20  BY_MAX) ){.     
1a880 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
1a890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
1a8a0 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20  DERBY_MIN );.   
1a8b0 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20     nRow = 1;.   
1a8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
1a8d0 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ow = (sqlite3_in
1a8e0 74 36 34 29 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t64)pLoop->nOut;
1a8f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20  .    }.    zMsg 
1a900 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1a910 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1a920 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a  (~%lld rows)", z
1a930 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20  Msg, nRow);.    
1a940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a950 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
1a960 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
1a970 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
1a980 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
1a990 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1a9a0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1a9b0 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
1a9c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1a9d0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
1a9e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a9f0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1aa00 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
1aa10 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
1aa20 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
1aa30 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
1aa40 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
1aa50 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
1aa60 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
1aa70 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1aa80 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
1aa90 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
1aaa0 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
1aab0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
1aac0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1aad0 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
1aae0 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
1aaf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
1ab00 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
1ab10 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e  lags,      /* On
1ab20 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
1ab30 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
1ab40 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
1ab50 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1ab60 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
1ab70 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
1ab80 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
1ab90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
1aba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1abb0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1abc0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1abd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1abe0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1abf0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1ac00 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
1ac10 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
1ac20 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
1ac30 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1ac40 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
1ac50 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
1ac60 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
1ac70 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
1ac80 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
1ac90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1aca0 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
1acb0 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
1acc0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
1acd0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1ace0 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
1acf0 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
1ad00 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1ad10 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
1ad20 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1ad30 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
1ad40 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1ad50 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
1ad60 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
1ad70 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
1ad80 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
1ad90 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1ada0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
1adb0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
1adc0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1add0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1ade0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1adf0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62  context */.  Vdb
1ae00 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
1ae30 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
1ae40 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
1ae50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ae60 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
1ae70 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
1ae80 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1ae90 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1aec0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1aed0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
1aee0 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
1aef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1af00 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
1af10 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
1af20 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
1af30 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
1af40 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
1af50 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
1af60 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
1af70 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
1af80 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
1af90 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1afa0 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
1afb0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1afc0 20 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74    Bitmask newNot
1afd0 52 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52  Ready;      /* R
1afe0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1aff0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1b000 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
1b010 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1b020 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e    pWC = pWInfo->
1b030 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  pWC;.  pLevel = 
1b040 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
1b050 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  l];.  pLoop = pL
1b060 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1b070 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1b080 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1b090 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1b0a0 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1b0b0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
1b0c0 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1b0d0 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1b0e0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1b0f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1b100 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1b110 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1b120 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
1b130 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1b140 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e  BLE)==0;.  VdbeN
1b150 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1b160 42 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20  Begin Join Loop 
1b170 25 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a  %d", iLevel));..
1b180 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1b190 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
1b1a0 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
1b1b0 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
1b1c0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
1b1d0 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
1b1e0 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
1b1f0 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
1b200 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
1b210 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
1b220 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
1b230 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
1b240 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
1b250 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
1b260 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
1b270 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
1b280 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
1b290 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
1b2a0 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
1b2b0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1b2c0 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
1b2d0 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
1b2e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
1b2f0 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
1b300 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
1b310 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
1b320 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
1b330 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
1b340 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
1b350 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1b360 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1b370 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1b380 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b390 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
1b3a0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
1b3b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b3c0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
1b3d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
1b3e0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
1b3f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1b400 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
1b410 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
1b420 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
1b430 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
1b440 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
1b450 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1b460 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
1b470 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
1b480 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
1b490 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
1b4a0 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
1b4b0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1b4c0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
1b4d0 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
1b4e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1b4f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b500 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
1b510 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1b520 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1b530 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
1b540 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
1b550 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20  flag"));.  }..  
1b560 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
1b570 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1b580 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d   subquery implem
1b590 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
1b5a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70  utine */.  if( p
1b5b0 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
1b5c0 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
1b5d0 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
1b5e0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
1b5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1b610 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e  eger, pTabItem->
1b620 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72  addrFillSub-1, r
1b630 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c  egYield);.    pL
1b640 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69  evel->p2 =  sqli
1b650 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1b660 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69   OP_Yield, regYi
1b670 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eld);.    VdbeCo
1b680 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1b690 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e  row of co-routin
1b6a0 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d  e %s", pTabItem-
1b6b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1b6c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b6d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
1b6e0 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72  regYield+1, addr
1b6f0 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
1b700 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  ->op = OP_Goto;.
1b710 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1b720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1b730 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
1b740 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1b750 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1b760 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1b770 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65   /* Case 1:  The
1b780 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
1b790 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
1b7a0 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
1b7b0 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
1b7c0 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
1b7d0 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
1b7e0 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
1b7f0 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
1b800 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
1b810 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f     int addrNotFo
1b820 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  und;.    int nCo
1b830 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70  nstraint = pLoop
1b840 2d 3e 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71  ->nTerm;..    sq
1b850 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1b860 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1b870 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
1b880 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1b890 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
1b8a0 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
1b8b0 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1b8c0 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
1b8d0 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1b8e0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
1b8f0 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65  nt iTarget = iRe
1b900 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65  g+j+2;.      pTe
1b910 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72  rm = pLoop->aTer
1b920 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
1b930 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b940 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1b950 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
1b960 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1b970 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1b980 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
1b990 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
1b9a0 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1b9b0 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
1b9c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1b9d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1b9e0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
1b9f0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
1ba00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1ba10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1ba20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1ba30 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
1ba40 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
1ba50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1ba60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ba70 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
1ba80 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
1ba90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1baa0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1bab0 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
1bac0 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1baf0 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1bb20 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
1bb30 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
1bb40 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1bb50 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1bb60 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1bb70 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1bb80 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1bb90 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1bba0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1bbb0 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1bbc0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1bbd0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b  l, pLoop->aTerm[
1bbe0 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
1bbf0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f   }.    pLevel->o
1bc00 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
1bc10 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1bc20 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1bc30 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1bc40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1bc50 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1bc60 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1bc70 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
1bc80 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73  traint+2);.    s
1bc90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1bca0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1bcb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1bcc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1bcd0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1bce0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1bcf0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1bd00 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70  !=0.   && (pLoop
1bd10 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1bd20 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1bd30 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d  RE_COLUMN_EQ))!=
1bd40 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1bd50 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69  se 2:  We can di
1bd60 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
1bd70 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
1bd80 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
1bd90 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
1bda0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1bdb0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1bdc0 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
1bdd0 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
1bde0 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
1bdf0 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
1be00 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
1be10 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
1be20 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
1be30 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1be40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20  >u.btree.nEq==1 
1be50 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  );.    iReleaseR
1be60 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1be70 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1be80 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1be90 70 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  p->aTerm[0];.   
1bea0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1beb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1bec0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1bed0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bee0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1bef0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1bf00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1bf10 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
1bf20 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
1bf30 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69  662 */.    iRowi
1bf40 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
1bf50 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1bf60 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30  pTerm, pLevel, 0
1bf70 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65  , bRev, iRelease
1bf80 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
1bf90 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1bfa0 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
1bfb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bfc0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
1bfd0 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
1bfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bff0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
1c000 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
1c010 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
1c020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c030 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1c040 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1c050 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1c060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c070 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1c080 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1c090 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1c0a0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1c0b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1c0c0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1c0d0 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1c0e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1c0f0 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1c100 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1c110 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1c120 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1c130 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1c140 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1c150 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1c160 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1c170 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1c180 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1c190 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1c1a0 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1c1b0 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1c1c0 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1c1d0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1c1e0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1c1f0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1c200 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1c210 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1c220 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1c230 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c240 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1c250 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72  rt = pLoop->aTer
1c260 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1c270 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1c280 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1c290 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1c2a0 3e 61 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  >aTerm[j++];.   
1c2b0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
1c2c0 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
1c2d0 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
1c2e0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
1c2f0 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
1c300 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
1c310 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1c320 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1c330 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1c340 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
1c350 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
1c360 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
1c370 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
1c380 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
1c390 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
1c3a0 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
1c3b0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1c3c0 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
1c3d0 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
1c3e0 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
1c3f0 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
1c400 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
1c410 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
1c420 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
1c430 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
1c440 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1c450 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
1c460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1c470 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
1c480 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1c490 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
1c4a0 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
1c4b0 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
1c4c0 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
1c4d0 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
1c4e0 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
1c4f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c500 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
1c510 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
1c520 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
1c530 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1c540 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
1c550 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
1c560 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
1c570 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
1c580 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1c590 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
1c5a0 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
1c5b0 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
1c5c0 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1c5d0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1c5e0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
1c5f0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
1c600 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20  2 */.      pX = 
1c610 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1c620 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1c630 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1c640 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
1c650 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1c660 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1c670 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c680 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1c690 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1c6a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c6b0 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1c6c0 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1c6d0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1c6e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1c6f0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1c700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c710 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1c720 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1c730 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1c740 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c750 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1c760 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1c770 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1c780 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1c790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c7a0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1c7b0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1c7c0 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1c7d0 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
1c7e0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1c7f0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1c800 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1c810 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1c820 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1c830 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
1c840 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1c850 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c860 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1c870 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1c880 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1c890 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
1c8a0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1c8b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c8c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c8d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1c8e0 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1c8f0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1c900 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1c910 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1c920 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1c930 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1c940 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1c950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1c960 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1c970 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1c980 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1c990 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1c9a0 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1c9b0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1c9c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1c9d0 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1c9e0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1c9f0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1ca00 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1ca10 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1ca20 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1ca30 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20    if( pStart==0 
1ca40 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20  && pEnd==0 ){.  
1ca50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1ca60 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1ca70 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1ca80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ca90 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1caa0 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1cab0 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  }.    if( testOp
1cac0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1cad0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
1cae0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1caf0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1cb00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1cb10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cb20 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
1cb30 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
1cb40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cb50 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1cb60 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1cb70 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1cb80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cb90 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
1cba0 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
1cbb0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1cbc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1cbd0 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
1cbe0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
1cbf0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1cc00 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
1cc10 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
1cc20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1cc30 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43  EXED ){.    /* C
1cc40 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73  ase 4: A scan us
1cc50 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
1cc60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1cc70 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
1cc80 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
1cc90 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
1cca0 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
1ccb0 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
1ccc0 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
1ccd0 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
1cce0 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
1ccf0 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
1cd00 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
1cd10 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
1cd20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
1cd30 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
1cd40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1cd50 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
1cd60 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
1cd70 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
1cd80 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
1cd90 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1cda0 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
1cdb0 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
1cdc0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
1cdd0 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
1cde0 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
1cdf0 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
1ce00 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
1ce10 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
1ce20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
1ce30 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
1ce40 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
1ce50 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
1ce60 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
1ce70 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1ce80 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
1ce90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1cea0 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
1ceb0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1cec0 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
1ced0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1cee0 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
1cef0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1cf00 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1cf10 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1cf20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
1cf30 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1cf40 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
1cf50 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
1cf60 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
1cf70 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
1cf80 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
1cf90 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
1cfa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
1cfb0 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
1cfc0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1cfd0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
1cfe0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1cff0 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
1d000 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
1d010 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
1d020 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
1d030 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
1d040 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
1d050 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1d060 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
1d070 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
1d080 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
1d090 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1d0a0 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
1d0b0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
1d0c0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
1d0d0 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
1d0e0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
1d0f0 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
1d100 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
1d110 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
1d120 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
1d130 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
1d140 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
1d150 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
1d160 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
1d170 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1d180 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
1d190 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
1d1a0 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
1d1b0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
1d1c0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1d1d0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1d1e0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1d1f0 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
1d200 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
1d210 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1d220 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
1d230 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1d240 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
1d250 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
1d260 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1d270 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
1d280 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1d290 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
1d2a0 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
1d2b0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1d2c0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1d2d0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1d2e0 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
1d2f0 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
1d300 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1d310 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1d320 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1d330 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1d340 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
1d350 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1d360 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1d370 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
1d380 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
1d390 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
1d3a0 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  _Noop,          
1d3b0 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63     /* 0: (!end_c
1d3c0 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20  onstraints) */. 
1d3d0 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
1d3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
1d3f0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1d400 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1d410 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20      OP_IdxLT    
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1d430 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1d440 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  && bRev) */.    
1d450 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  };.    int nEq =
1d460 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1d470 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  nEq;  /* Number 
1d480 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1d490 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
1d4a0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
1d4b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d4c0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
1d4d0 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
1d4e0 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
1d4f0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1d500 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1d510 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1d520 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
1d530 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
1d560 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
1d570 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
1d580 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
1d590 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1d5a0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
1d5b0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
1d5c0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
1d5d0 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
1d5e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1d5f0 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
1d600 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1d630 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
1d640 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1d650 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d670 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
1d680 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
1d690 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1d6a0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1d6b0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
1d6c0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
1d6d0 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
1d6e0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1d6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d700 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1d710 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
1d720 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1d750 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
1d760 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
1d770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d780 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
1d790 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
1d7a0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
1d7b0 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20  xtraReg = 0;    
1d7c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d7d0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
1d7e0 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
1d7f0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d810 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
1d820 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
1d830 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20   *zStartAff;    
1d840 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
1d850 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f  nity for start o
1d860 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1d870 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
1d880 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20  zEndAff;        
1d890 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1d8a0 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61  ty for end of ra
1d8b0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
1d8c0 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  /..    pIdx = pL
1d8d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1d8e0 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72  dex;.    iIdxCur
1d8f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
1d900 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28 6e 45 71  ur;.    k = (nEq
1d910 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
1d920 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e 61 69 43  ? -1 : pIdx->aiC
1d930 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20  olumn[nEq]);..  
1d940 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
1d950 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
1d960 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
1d970 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
1d980 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73   .    ** was pas
1d990 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1d9a0 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tion to implemen
1d9b0 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  t a "SELECT min(
1d9c0 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20  x) ..." .    ** 
1d9d0 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20  query, then the 
1d9e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79  caller will only
1d9f0 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20   allow the loop 
1da00 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a  to run for.    *
1da10 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61  * a single itera
1da20 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
1da30 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1da40 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20  row returned.   
1da50 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68   ** should not h
1da60 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ave a NULL value
1da70 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20   stored in 'x'. 
1da80 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73  If column 'x' is
1da90 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73  .    ** the firs
1daa0 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20  t one after the 
1dab0 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  nEq equality con
1dac0 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
1dad0 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68  index,.    ** th
1dae0 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65  is requires some
1daf0 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
1db00 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  g..    */.    if
1db10 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  ( (wctrlFlags&WH
1db20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
1db30 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  !=0.     && (pWI
1db40 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 29 0a 20  nfo->nOBSat>0). 
1db50 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
1db60 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29  olumn>nEq).    )
1db70 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
1db80 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
1db90 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  pr==1 ); */.    
1dba0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
1dbb0 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
1dbc0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
1dbd0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20  ->aiColumn[nEq] 
1dbe0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69  ); */.      isMi
1dbf0 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
1dc00 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1dc10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1dc20 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
1dc30 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
1dc40 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
1dc50 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
1dc60 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
1dc70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20  .    */.    j = 
1dc80 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  nEq;.    if( pLo
1dc90 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1dca0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1dcb0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
1dcc0 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72  rt = pLoop->aTer
1dcd0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
1dce0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1dcf0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
1dd00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1dd10 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
1dd20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d       pRangeEnd =
1dd30 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b   pLoop->aTerm[j+
1dd40 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1dd50 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1dd60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1dd70 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1dd80 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
1dd90 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
1dda0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
1ddb0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
1ddc0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
1ddd0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
1dde0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1ddf0 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
1de00 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1de10 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
1de20 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1de30 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1de40 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74  pLevel, pWC, not
1de50 52 65 61 64 79 2c 20 62 52 65 76 2c 20 6e 45 78  Ready, bRev, nEx
1de60 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41  traReg, &zStartA
1de70 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45  ff.    );.    zE
1de80 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44  ndAff = sqlite3D
1de90 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1dea0 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
1deb0 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1dec0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
1ded0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1dee0 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
1def0 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1df00 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
1df10 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
1df20 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
1df30 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
1df40 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
1df50 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
1df60 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
1df70 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
1df80 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
1df90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1dfa0 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c   (nEq<pIdx->nCol
1dfb0 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49  umn && bRev==(pI
1dfc0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
1dfd0 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
1dfe0 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
1dff0 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c  ev && pIdx->nCol
1e000 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  umn==nEq).    ){
1e010 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
1e020 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
1e030 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
1e040 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
1e050 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1e060 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
1e070 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
1e080 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_LE );.    test
1e090 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
1e0a0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
1e0b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e0c0 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _GE );.    testc
1e0d0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1e0e0 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
1e0f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
1e100 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e110 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
1e120 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1e130 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
1e140 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
1e150 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
1e160 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1e170 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
1e180 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
1e190 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
1e1a0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1e1b0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1e1c0 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
1e1d0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
1e1e0 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
1e1f0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
1e200 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1e210 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1e220 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
1e230 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
1e240 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
1e250 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
1e260 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1e270 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
1e280 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1e290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e2a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
1e2b0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
1e2c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
1e2d0 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
1e2e0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1e2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1e300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
1e310 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
1e320 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
1e330 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1e340 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
1e350 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
1e360 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1e370 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1e380 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
1e390 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
1e3a0 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
1e3b0 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
1e3c0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
1e3d0 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
1e3e0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
1e3f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1e400 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
1e410 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
1e420 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
1e430 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
1e440 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
1e450 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
1e460 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
1e470 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
1e480 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1e490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e4a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1e4b0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1e4c0 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
1e4d0 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
1e4e0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1e4f0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1e500 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1e510 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
1e520 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1e530 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
1e540 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
1e550 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e560 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
1e570 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
1e580 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1e590 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
1e5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e5b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1e5c0 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1e5d0 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1e5e0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1e5f0 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1e600 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1e610 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1e620 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1e630 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1e640 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1e650 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1e660 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1e670 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1e680 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1e690 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1e6a0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1e6b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1e6c0 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
1e6d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e6e0 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
1e6f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e700 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1e710 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e720 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
1e730 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e740 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1e750 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e760 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
1e770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e780 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1e790 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1e7a0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1e7b0 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
1e7c0 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1e7d0 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1e7e0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1e7f0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1e800 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1e810 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1e820 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1e830 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1e840 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1e850 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1e860 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1e870 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1e880 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1e890 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1e8a0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1e8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e8c0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1e8d0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1e8e0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1e8f0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1e900 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
1e910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e920 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1e930 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1e940 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1e950 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
1e960 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
1e970 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1e980 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1e990 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
1e9a0 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
1e9b0 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
1e9c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
1e9d0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e9e0 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
1e9f0 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
1ea00 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
1ea10 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
1ea20 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
1ea30 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
1ea40 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
1ea50 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
1ea60 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1ea70 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
1ea80 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
1ea90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1eaa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eab0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1eac0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1ead0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1eae0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
1eaf0 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
1eb00 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
1eb10 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1eb20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
1eb30 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
1eb40 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
1eb50 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
1eb60 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
1eb70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1eb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1eb90 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1eba0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1ebb0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1ebc0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
1ebd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1ebe0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1ebf0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
1ec00 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1ec10 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
1ec20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
1ec30 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
1ec40 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
1ec50 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1ec60 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
1ec70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1ec80 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1ec90 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
1eca0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
1ecb0 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
1ecc0 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
1ecd0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
1ece0 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
1ecf0 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
1ed00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1ed10 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
1ed20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ed30 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
1ed40 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
1ed50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ed60 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1ed70 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
1ed80 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
1ed90 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
1eda0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1edb0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
1edc0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
1edd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1ede0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1edf0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ee00 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
1ee10 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
1ee20 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1ee30 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
1ee40 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
1ee50 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1ee60 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
1ee70 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
1ee80 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
1ee90 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
1eea0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1eeb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1eec0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1eed0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1eee0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1eef0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
1ef00 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
1ef10 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1ef20 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
1ef30 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1ef40 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ef50 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1ef60 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
1ef70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ef80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ef90 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1efa0 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20  r, nEq, r1);.   
1efb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1efc0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1efd0 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29  l, r1, addrCont)
1efe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1eff0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f000 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
1f010 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1f020 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
1f030 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
1f040 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1f050 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
1f060 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
1f070 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
1f080 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21  eEnd);.    if( !
1f090 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
1f0a0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
1f0b0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1f0c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1f0d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f0e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f0f0 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
1f100 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
1f110 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1f120 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1f130 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1f140 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1f150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f160 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
1f170 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
1f180 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
1f190 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a  d seek */.    }.
1f1a0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
1f1b0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
1f1c0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
1f1d0 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
1f1e0 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
1f1f0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
1f200 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
1f210 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
1f220 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
1f230 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1f240 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
1f250 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  UE ){.      pLev
1f260 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1f270 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f280 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c  bRev ){.      pL
1f290 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
1f2a0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
1f2b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1f2c0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d  = OP_Next;.    }
1f2d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1f2e0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69  = iIdxCur;.    i
1f2f0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1f300 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
1f310 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 43 4f  MN_EQ | WHERE_CO
1f320 4c 55 4d 4e 5f 52 41 4e 47 45 20 7c 20 0a 20 20  LUMN_RANGE | .  
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f          WHERE_CO
1f350 4c 55 4d 4e 5f 4e 55 4c 4c 20 7c 20 57 48 45 52  LUMN_NULL | WHER
1f360 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 3d 3d 30  E_COLUMN_IN))==0
1f370 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1f380 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1f390 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1f3a0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
1f3b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f3c0 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1f3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1f3e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f3f0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
1f400 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
1f410 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1f420 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
1f430 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
1f440 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
1f450 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
1f460 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
1f470 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
1f480 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1f490 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1f4a0 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
1f4b0 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
1f4c0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1f4d0 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
1f4e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
1f4f0 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
1f500 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1f510 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
1f520 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
1f530 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1f540 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
1f550 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
1f560 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1f570 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
1f580 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
1f590 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
1f5a0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
1f5b0 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
1f5c0 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
1f5d0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1f5e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1f5f0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f610 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
1f620 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
1f630 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
1f640 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
1f650 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
1f660 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
1f670 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
1f680 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
1f690 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
1f6a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1f6b0 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
1f6c0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
1f6d0 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
1f6e0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
1f6f0 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
1f700 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
1f710 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
1f720 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
1f730 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
1f740 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
1f750 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f760 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
1f770 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
1f780 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
1f790 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
1f7a0 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
1f7b0 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
1f7c0 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
1f7d0 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
1f7e0 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
1f7f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1f800 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1f810 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
1f820 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
1f830 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1f840 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
1f850 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
1f860 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
1f870 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
1f880 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
1f890 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
1f8a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f8b0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1f8c0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1f8d0 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1f8e0 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1f8f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
1f900 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
1f910 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
1f920 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
1f930 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f940 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
1f950 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
1f960 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
1f970 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
1f980 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f990 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
1f9c0 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
1f9d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
1f9e0 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
1f9f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
1fa00 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1fa10 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
1fa20 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
1fa30 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
1fa40 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
1fa50 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
1fa60 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
1fa70 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
1fa80 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
1fa90 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
1faa0 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
1fab0 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
1fac0 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
1fad0 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
1fae0 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
1faf0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1fb00 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
1fb10 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
1fb20 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
1fb30 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
1fb40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fb50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1fb60 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
1fb70 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
1fb80 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
1fb90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fbb0 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
1fbc0 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
1fbd0 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
1fbe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fc00 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
1fc10 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
1fc20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
1fc30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fc40 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
1fc50 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
1fc60 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc90 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
1fca0 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
1fcb0 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
1fcc0 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
1fcd0 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
1fce0 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
1fcf0 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
1fd00 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1fd30 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
1fd40 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1fd60 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
1fd70 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1fd80 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
1fd90 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a  Loop->aTerm[0];.
1fda0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1fdb0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1fdc0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
1fdd0 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a  ator & WO_OR );.
1fde0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
1fdf0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1fe00 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
1fe10 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
1fe20 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1fe30 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
1fe40 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
1fe50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1fe60 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
1fe70 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
1fe80 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54   SrcList in pOrT
1fe90 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
1fea0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
1feb0 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
1fec0 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
1fed0 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
1fee0 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
1fef0 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
1ff00 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
1ff10 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
1ff20 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
1ff30 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
1ff40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1ff50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ff60 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
1ff70 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
1ff80 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
1ff90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ffa0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
1ffb0 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
1ffc0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1ffd0 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
1ffe0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fff0 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
20000 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
20010 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
20020 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
20030 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
20040 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
20050 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
20060 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20080 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
20090 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
200a0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
200b0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
200c0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
200d0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
200e0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
200f0 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
20100 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
20110 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
20120 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
20130 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
20140 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
20150 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
20160 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
20170 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
20180 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
20190 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
201a0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
201b0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
201c0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
201d0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
201e0 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
201f0 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
20200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20210 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
20220 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
20230 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
20240 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
20250 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
20260 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
20270 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
20280 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
20290 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
202a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
202b0 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
202c0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
202d0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
202e0 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
202f0 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
20300 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
20310 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
20320 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
20330 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
20340 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
20350 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
20360 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
20370 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
20380 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
20390 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
203a0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
203b0 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
203c0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
203d0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
203e0 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
203f0 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
20400 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
20410 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
20420 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
20430 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
20440 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
20450 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
20460 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
20470 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
20480 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
20490 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
204a0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
204b0 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
204c0 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
204d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
204e0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
204f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20520 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
20530 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
20540 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
20550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20560 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
20570 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
20580 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
20590 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
205a0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
205b0 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
205c0 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
205d0 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
205e0 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
205f0 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
20600 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
20610 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
20620 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
20630 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
20640 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
20650 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
20660 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
20670 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
20680 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
20690 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
206a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
206b0 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
206c0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
206d0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
206e0 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
206f0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
20700 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
20710 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
20720 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
20730 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
20740 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
20750 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
20760 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
20770 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
20780 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
20790 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
207a0 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
207b0 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
207c0 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
207d0 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
207e0 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
207f0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
20800 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
20810 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
20820 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
20830 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
20840 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
20850 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
20860 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
20870 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
20880 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
20890 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
208a0 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
208b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
208c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
208d0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
208e0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
208f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20900 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
20910 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
20920 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
20930 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
20940 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
20950 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29  L|TERM_ORINFO) )
20960 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20970 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
20980 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
20990 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
209a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
209b0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
209c0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
209d0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
209e0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
209f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
20a00 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e  (pParse->db, pAn
20a10 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
20a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20a30 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
20a40 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
20a50 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
20a60 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
20a70 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
20a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20a90 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
20aa0 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
20ab0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
20ac0 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
20ad0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
20ae0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
20af0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
20b00 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f   || (pOrTerm->eO
20b10 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
20b20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
20b30 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
20b40 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
20b50 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
20b60 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
20b70 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
20b80 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
20b90 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
20ba0 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26    if( pAndExpr &
20bb0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
20bc0 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46  ty(pOrExpr, EP_F
20bd0 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
20be0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
20bf0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
20c00 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
20c10 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
20c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c30 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
20c40 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
20c50 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
20c60 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
20c70 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
20c80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
20c90 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
20ca0 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
20cd0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
20ce0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
20cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d00 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
20d10 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45  ORCE_TABLE | WHE
20d20 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
20d30 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
20d40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
20d50 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
20d60 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
20d70 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20d80 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d );.        if(
20d90 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
20da0 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f          WhereLoo
20db0 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20  p *pSubLoop;.   
20dc0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e         explainOn
20dd0 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
20de0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
20df0 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
20e00 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70  >a[0], iLevel, p
20e10 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a  Level->iFrom, 0.
20e20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
20e30 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
20e40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
20e50 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
20e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20e70 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
20e80 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
20e90 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
20ea0 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
20eb0 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
20ec0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
20ed0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
20ee0 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
20ef0 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
20f30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20f40 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20f50 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
20f60 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20f90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
20fa0 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
20fb0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
20fc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20fd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20fe0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
20ff0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
21000 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
21010 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
21020 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
21030 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
21040 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
21050 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
21060 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
21070 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
21080 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
21090 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
210a0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
210b0 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
210c0 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
210d0 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
210e0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
210f0 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
21100 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21110 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
21120 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
21130 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
21140 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
21150 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
21160 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
21170 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
21180 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
21190 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
211a0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
211b0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
211c0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
211d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
211e0 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
211f0 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
21200 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
21210 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
21220 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
21230 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
21240 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
21250 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
21260 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
21270 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
21280 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
21290 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
212a0 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
212b0 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
212c0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
212d0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
212e0 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
212f0 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
21300 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
21310 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
21320 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
21330 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
21340 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
21350 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
21360 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
21370 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
21380 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
21390 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
213a0 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
213b0 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
213c0 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
213d0 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
213e0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
213f0 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
21400 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
21410 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
21420 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
21430 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
21440 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
21450 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
21460 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21470 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
21480 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
21490 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
214a0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
214b0 44 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  DEX)==0.        
214c0 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
214d0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
214e0 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a  e.pIndex==pCov).
214f0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
21500 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21510 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
21520 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
21530 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
21540 20 70 43 6f 76 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pCov = pLoop->u
21550 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
21560 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21570 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
21580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21590 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
215a0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
215b0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
215c0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
215d0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
215e0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
215f0 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
21600 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
21610 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21620 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
21630 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
21640 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
21650 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
21660 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
21670 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
21680 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
21690 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
216a0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
216b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45  Parse->db, pAndE
216c0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
216d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
216e0 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
216f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21700 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
21710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21720 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
21730 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
21740 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
21750 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21760 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
21770 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
21780 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
21790 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
217a0 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
217b0 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
217c0 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
217d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
217e0 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
217f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21800 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
21810 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
21820 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72  /* Case 6:  Ther
21830 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
21840 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
21850 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
21860 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
21870 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
21880 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
21890 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
218a0 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
218b0 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
218c0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
218d0 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
218e0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
218f0 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
21900 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
21910 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70  bRev==1 );.    p
21920 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
21930 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65  p[bRev];.    pLe
21940 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
21950 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
21960 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
21970 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74  AddOp2(v, aStart
21980 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64  [bRev], iCur, ad
21990 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
219a0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
219b0 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
219c0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20  CAN_STEP;.  }.  
219d0 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  newNotReady = no
219e0 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
219f0 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
21a00 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
21a10 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
21a20 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
21a30 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
21a40 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
21a50 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
21a60 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
21a70 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
21a80 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
21a90 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
21aa0 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
21ab0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
21ac0 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
21ad0 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
21ae0 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
21af0 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
21b00 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
21b10 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
21b20 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
21b30 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
21b40 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
21b50 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
21b60 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
21b70 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
21b80 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
21b90 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
21ba0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21bb0 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37  ; /* IMP: R-3057
21bc0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74  5-11662 */.    t
21bd0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21be0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
21bf0 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
21c00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21c10 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
21c20 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
21c30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
21c40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
21c50 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
21c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
21c70 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  case( pWInfo->un
21c80 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20  testedTerms==0. 
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
21ca0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
21cb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
21cc0 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29  TABLE_ONLY)!=0 )
21cd0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
21ce0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
21cf0 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
21d00 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20  e;.    }.    pE 
21d10 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
21d20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
21d30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
21d40 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
21d50 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
21d60 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
21d70 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  in) ){.      con
21d80 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
21d90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
21da0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
21db0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
21dc0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
21dd0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
21de0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
21df0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
21e00 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f   code to test fo
21e10 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72  r implied constr
21e20 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74  aints based on t
21e30 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a  ransitivity.  **
21e40 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65   of the "==" ope
21e50 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
21e60 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
21e70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
21e80 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e  ntains "t1.a=t2.
21e90 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33  b" and "t2.b=123
21ea0 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72  ".  ** and we ar
21eb0 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20  e coding the t1 
21ec0 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20  loop and the t2 
21ed0 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74  loop has not yet
21ee0 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65   coded,.  ** the
21ef0 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  n we cannot use 
21f00 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  the "t1.a=t2.b" 
21f10 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20  constraint, but 
21f20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a  we can code.  **
21f30 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31   the implied "t1
21f40 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69  .a=123" constrai
21f50 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
21f60 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
21f70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
21f80 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
21f90 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
21fa0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
21fb0 3b 0a 20 20 20 20 45 78 70 72 20 73 45 71 3b 0a  ;.    Expr sEq;.
21fc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
21fd0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
21fe0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
21ff0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
22000 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
22010 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
22020 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
22030 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
22040 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
22050 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
22060 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  ;.    pE = pTerm
22070 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
22080 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
22090 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
220a0 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73  mJoin) );.    as
220b0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72  sert( (pTerm->pr
220c0 65 72 65 71 52 69 67 68 74 20 26 20 6e 65 77 4e  ereqRight & newN
220d0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
220e0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
220f0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
22100 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
22110 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
22120 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
22130 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
22140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22150 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
22160 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
22170 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56   continue;.    V
22180 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
22190 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69  v, "begin transi
221a0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22  tive constraint"
221b0 29 29 3b 0a 20 20 20 20 73 45 71 20 3d 20 2a 70  ));.    sEq = *p
221c0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
221d0 73 45 71 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  sEq.pLeft = pE->
221e0 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74  pLeft;.    sqlit
221f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22200 61 72 73 65 2c 20 26 73 45 71 2c 20 61 64 64 72  arse, &sEq, addr
22210 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
22220 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20  PIFNULL);.  }.. 
22230 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
22240 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
22250 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
22260 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
22270 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
22280 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
22290 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
222a0 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
222b0 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
222c0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
222d0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
222e0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
222f0 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
22300 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22320 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22330 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
22340 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
22350 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22360 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
22370 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
22380 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22390 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
223a0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
223b0 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
223c0 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
223d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
223e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
223f0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
22400 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
22410 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
22420 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
22430 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22440 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
22450 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
22460 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
22470 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
22480 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
22490 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
224a0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
224b0 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
224c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
224d0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
224e0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
224f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
22500 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
22510 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
22520 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22530 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22540 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
22550 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
22560 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22570 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
22580 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
22590 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
225a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
225b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
225c0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
225d0 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61  return newNotRea
225e0 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  dy;.}..#ifdef WH
225f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
22600 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
22610 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
22620 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
22630 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
22640 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
22650 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
22660 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  p, SrcList *pTab
22670 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20  List){.  int nb 
22680 3d 20 32 2a 28 28 70 54 61 62 4c 69 73 74 2d 3e  = 2*((pTabList->
22690 6e 53 72 63 2b 31 35 29 2f 31 36 29 3b 0a 20 20  nSrc+15)/16);.  
226a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
226b0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61  tem *pItem = pTa
226c0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54  bList->a + p->iT
226d0 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ab;.  Table *pTa
226e0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
226f0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
22700 72 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30  rintf("%c %2d.%0
22710 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
22720 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
22730 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
22740 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
22750 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
22760 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
22770 62 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22  bugPrintf(" %8s"
22780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22790 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
227a0 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
227b0 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
227c0 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
227d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
227e0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
227f0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ){.    if( p->u.
22800 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a  btree.pIndex ){.
22810 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
22820 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   *zName = p->u.b
22830 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
22840 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  me;.      if( zN
22850 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d  ame==0 ) zName =
22860 20 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66   "ipk";.      if
22870 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
22880 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
22890 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
228a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
228b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
228c0 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
228d0 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
228e0 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
228f0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
22900 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
22910 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22920 69 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64  intf(".%-12s %2d
22930 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
22940 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
22950 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22960 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22970 25 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %16s","");.    }
22980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
22990 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
229a0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
229b0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
229c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
229d0 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
229f0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
22a00 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
22a10 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
22a20 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
22a30 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
22a40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
22a50 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
22a60 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
22a70 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
22a80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22a90 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
22aa0 31 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  15s", z);.    sq
22ab0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
22ac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
22ad0 67 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35  gPrintf(" fg %05
22ae0 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
22af0 61 67 73 2c 20 70 2d 3e 6e 54 65 72 6d 29 3b 0a  ags, p->nTerm);.
22b00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22b10 69 6e 74 66 28 22 20 63 6f 73 74 20 25 2e 32 67  intf(" cost %.2g
22b20 2c 25 2e 32 67 2c 25 2e 32 67 5c 6e 22 2c 0a 20  ,%.2g,%.2g\n",. 
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 20 20 20 70 2d 3e 70 72 65 72 65 71 2c 20 70      p->prereq, p
22b50 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
22b60 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23  n, p->nOut);.}.#
22b70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  endif../*.** Dea
22b80 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
22b90 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
22ba0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
22bb0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
22bc0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
22bd0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
22be0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 73  ereLoop *p){.  s
22bf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22c00 20 70 2d 3e 61 54 65 72 6d 29 3b 0a 20 20 70 2d   p->aTerm);.  p-
22c10 3e 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  >aTerm = 0;.  p-
22c20 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 66  >nTerm = 0;.  if
22c30 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
22c40 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
22c50 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  LE)!=0 ){.    if
22c60 28 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  ( p->u.vtab.need
22c70 46 72 65 65 20 29 20 73 71 6c 69 74 65 33 5f 66  Free ) sqlite3_f
22c80 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
22c90 78 53 74 72 29 3b 0a 20 20 20 20 70 2d 3e 75 2e  xStr);.    p->u.
22ca0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
22cb0 30 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  0;.    p->u.vtab
22cc0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 7d  .idxStr = 0;.  }
22cd0 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
22ce0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
22cf0 50 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  P_INDEX)!=0 && p
22d00 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22d10 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
22d20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
22d30 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
22d40 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71  zColAff);.    sq
22d50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22d70 78 29 3b 0a 20 20 20 20 70 2d 3e 75 2e 62 74 72  x);.    p->u.btr
22d80 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
22d90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
22da0 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
22db0 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
22dc0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
22dd0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
22de0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
22df0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
22e00 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
22e10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
22e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22e30 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
22e40 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
22e50 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
22e60 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
22e70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22e80 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
22e90 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
22ea0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
22eb0 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
22ec0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
22ed0 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
22ee0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
22ef0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
22f00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
22f10 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
22f20 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
22f30 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
22f40 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
22f50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22f60 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
22f70 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
22f80 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
22f90 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
22fa0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
22fb0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
22fc0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
22fd0 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
22fe0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
22ff0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
23000 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
23010 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
23020 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
23030 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
23040 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
23050 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
23060 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
23070 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
23080 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
23090 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
230a0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
230b0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
230c0 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
230d0 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
230e0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
230f0 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
23100 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
23110 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
23120 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
23130 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
23140 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
23150 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
23160 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
23170 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
23180 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
23190 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
231a0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
231b0 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
231c0 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
231d0 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
231e0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
231f0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
23200 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
23210 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
23220 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
23230 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
23240 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
23250 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
23260 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
23270 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
23280 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
23290 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
232a0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
232b0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
232c0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
232d0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
232e0 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
232f0 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
23300 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
23310 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
23320 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
23330 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
23340 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
23350 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
23360 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
23370 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
23380 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
23390 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
233a0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
233b0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
233c0 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
233d0 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
233e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
233f0 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
23400 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
23410 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
23420 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
23430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23440 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
23450 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
23460 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
23470 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
23480 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
23490 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
234a0 78 74 20 3d 20 30 2c 20 2a 70 54 6f 46 72 65 65  xt = 0, *pToFree
234b0 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
234c0 6d 20 2a 2a 70 61 54 65 72 6d 20 3d 20 30 3b 0a  m **paTerm = 0;.
234d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
234e0 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20  pBuilder->db;.  
234f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
23500 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
23510 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Info;..  /* If p
23520 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69  Builder->pBest i
23530 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
23540 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
23550 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20  of the single.  
23560 2a 2a 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f  ** best WhereLoo
23570 70 2e 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42  p.  pBuilder->pB
23580 65 73 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30  est->maskSelf==0
23590 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
235a0 6e 6f 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68  no.  ** prior Wh
235b0 65 72 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65  ereLoops have be
235c0 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
235d0 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
235e0 74 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a  t pTemplate.  **
235f0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 74 68   is therefore th
23600 65 20 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63  e first and henc
23610 65 20 74 68 65 20 62 65 73 74 20 61 6e 64 20 73  e the best and s
23620 68 6f 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65  hould be retaine
23630 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  d..  */.  if( (p
23640 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65   = pBuilder->pBe
23650 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  st)!=0 ){.    if
23660 28 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30  ( p->maskSelf!=0
23670 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
23680 3e 72 52 75 6e 2b 70 2d 3e 72 53 65 74 75 70 20  >rRun+p->rSetup 
23690 3c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  < pTemplate->rRu
236a0 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  n+pTemplate->rSe
236b0 74 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 67  tup ){.        g
236c0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
236d0 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
236e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  }.      if( p->r
236f0 52 75 6e 2b 70 2d 3e 72 53 65 74 75 70 20 3d 3d  Run+p->rSetup ==
23700 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
23710 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  +pTemplate->rSet
23720 75 70 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  up.       && p->
23730 70 72 65 72 65 71 20 3c 3d 20 70 54 65 6d 70 6c  prereq <= pTempl
23740 61 74 65 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ate->prereq ){. 
23750 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
23760 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
23770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23780 20 20 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70 6c      *p = *pTempl
23790 61 74 65 3b 0a 20 20 20 20 70 2d 3e 61 54 65 72  ate;.    p->aTer
237a0 6d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 75 2e  m = 0;.    p->u.
237b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
237c0 30 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  0;.#if WHERETRAC
237d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
237e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
237f0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
23800 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23810 72 69 6e 74 66 28 22 69 6e 73 2d 62 65 73 74 3a  rintf("ins-best:
23820 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
23830 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
23840 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
23850 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
23860 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
23870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
23880 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
23890 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
238a0 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77  ereLoop to overw
238b0 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74  rite, or which t
238c0 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69  akes.  ** priori
238d0 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74  ty over pTemplat
238e0 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  e..  */.  for(pp
238f0 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c  Prev=&pWInfo->pL
23900 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b  oops, p=*ppPrev;
23910 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
23920 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
23930 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
23940 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
23950 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
23960 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
23970 2d 3e 69 53 6f 72 74 49 64 78 20 29 20 63 6f 6e  ->iSortIdx ) con
23980 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23990 2d 3e 6e 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74  ->nTerm<pTemplat
239a0 65 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 26 26  e->nTerm.     &&
239b0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
239c0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
239d0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
239e0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
239f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
23a00 0a 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74  .     && p->u.bt
23a10 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d  ree.pIndex==pTem
23a20 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70  plate->u.btree.p
23a30 49 6e 64 65 78 0a 20 20 20 20 20 26 26 20 70 2d  Index.     && p-
23a40 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61  >prereq==pTempla
23a50 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
23a60 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77  {.      /* Overw
23a70 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
23a80 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
23a90 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74  an similar one t
23aa0 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 2a  hat uses.      *
23ab0 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  * more terms of 
23ac0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
23ad0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
23ae0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
23af0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
23b00 2c 20 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , p);.      brea
23b10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
23b20 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
23b30 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
23b40 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ==p->prereq.    
23b50 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
23b60 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23b70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
23b80 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
23b90 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  n.    ){.      /
23ba0 2a 20 41 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e  * Already holdin
23bb0 67 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 62 65  g an equal or be
23bc0 74 74 65 72 20 57 68 65 72 65 4c 6f 6f 70 2e 0a  tter WhereLoop..
23bd0 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20        ** Return 
23be0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
23bf0 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68   or adding anyth
23c00 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  ing */.      got
23c10 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  o whereLoopInser
23c20 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  t_noop;.    }.  
23c30 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
23c40 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
23c50 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
23c60 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
23c70 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
23c80 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20  plate->rSetup.  
23c90 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
23ca0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
23cb0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f     ){.      /* O
23cc0 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
23cd0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
23ce0 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65  ith a better one
23cf0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20   */.      pNext 
23d00 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
23d10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 43        whereLoopC
23d20 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 20  lear(db, p);.   
23d30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23d40 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
23d50 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
23d60 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
23d70 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
23d80 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
23d90 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
23da0 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
23db0 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
23dc0 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
23dd0 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
23de0 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
23df0 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
23e00 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
23e10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
23e20 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
23e30 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
23e40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23e50 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
23e60 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
23e70 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
23e80 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62  , pBuilder->pTab
23e90 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
23ea0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23eb0 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
23ec0 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
23ed0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
23ee0 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c   pBuilder->pTabL
23ef0 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
23f00 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
23f10 20 20 20 70 20 3d 20 70 54 6f 46 72 65 65 20 3d     p = pToFree =
23f20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23f30 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
23f40 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
23f50 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
23f60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23f70 20 20 7d 0a 20 20 69 66 28 20 70 54 65 6d 70 6c    }.  if( pTempl
23f80 61 74 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20  ate->nTerm ){.  
23f90 20 20 70 61 54 65 72 6d 20 3d 20 73 71 6c 69 74    paTerm = sqlit
23fa0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
23fb0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65  , pTemplate->nTe
23fc0 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65  rm*sizeof(p->aTe
23fd0 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  rm[0]));.    if(
23fe0 20 70 61 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20   paTerm==0 ){.  
23ff0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24000 65 28 64 62 2c 20 70 54 6f 46 72 65 65 29 3b 0a  e(db, pToFree);.
24010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24020 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
24030 0a 20 20 7d 0a 20 20 2a 70 20 3d 20 2a 70 54 65  .  }.  *p = *pTe
24040 6d 70 6c 61 74 65 3b 0a 20 20 70 2d 3e 70 4e 65  mplate;.  p->pNe
24050 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a  xtLoop = pNext;.
24060 20 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20    *ppPrev = p;. 
24070 20 70 2d 3e 61 54 65 72 6d 20 3d 20 70 61 54 65   p->aTerm = paTe
24080 72 6d 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 65  rm;.  if( p->nTe
24090 72 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  rm ){.    memcpy
240a0 28 70 2d 3e 61 54 65 72 6d 2c 20 70 54 65 6d 70  (p->aTerm, pTemp
240b0 6c 61 74 65 2d 3e 61 54 65 72 6d 2c 20 70 2d 3e  late->aTerm, p->
240c0 6e 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e  nTerm*sizeof(p->
240d0 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a  aTerm[0]));.  }.
240e0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
240f0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24100 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
24110 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
24120 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
24130 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
24140 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
24150 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
24160 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24170 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
24180 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 6d 70 6c  else{.    pTempl
24190 61 74 65 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  ate->u.vtab.need
241a0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
241b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
241c0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
241d0 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  e if the insert 
241e0 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68  is a no-op */.wh
241f0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
24200 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41  op:.#if WHERETRA
24210 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
24220 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
24230 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
24240 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24250 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29  tf("ins-noop: ")
24260 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
24270 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
24280 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69  pBuilder->pTabLi
24290 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
242a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
242b0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  OK;  .}../*.** W
242c0 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
242d0 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
242e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
242f0 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  q terms of the i
24300 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20  ndex pIndex..** 
24310 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
24320 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   more..**.** If 
24330 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
24340 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
24350 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
24360 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
24370 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
24380 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
24390 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
243a0 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
243b0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
243c0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
243d0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
243e0 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
243f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24400 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
24410 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
24420 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
24430 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
24440 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
24450 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
24460 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  x on pSrc */.  i
24470 6e 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  nt nInMul       
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  * Number of iter
244a0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
244b0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
244c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
244d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
244e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
244f0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
24500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
24510 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
24520 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
24530 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
24540 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
24550 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
24560 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
24570 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
24580 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
24590 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
245a0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
245b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
245c0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
245d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
245e0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
245f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24600 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
24610 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
24620 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 61 76  .  WhereLoop sav
24630 65 64 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  edLoop;         
24640 20 20 20 2f 2a 20 53 61 76 65 64 20 6f 72 69 67     /* Saved orig
24650 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  inal content of 
24660 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
24670 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
24680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24690 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
246a0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
246b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
246c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
246d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
246e0 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
246f0 20 69 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   iRowEst;       
24700 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
24710 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65  mated index sele
24720 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 64 6f 75  ctivity */.  dou
24730 62 6c 65 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ble rLogSize;   
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24750 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
24760 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
24770 72 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70  reTerm *pTop, *p
24780 42 74 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Btm;         /* 
24790 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
247a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
247b0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 42 75 69   */..  db = pBui
247c0 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  lder->db;.  pNew
247d0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
247e0 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
247f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
24800 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24810 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
24820 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
24830 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
24840 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24850 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24860 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
24870 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
24880 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
24890 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
248a0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
248b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
248c0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
248d0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
248e0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
248f0 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
24900 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63  tnum<=0 || (pSrc
24910 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
24920 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
24930 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
24940 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
24950 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
24960 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73  }else{.    opMas
24970 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
24980 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c  WO_ISNULL|WO_GT|
24990 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
249a0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  E;.  }.  if( pPr
249b0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
249c0 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
249d0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
249e0 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66 28 20 70  WO_LE);..  if( p
249f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24a00 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   < pProbe->nColu
24a10 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  mn ){.    iCol =
24a20 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
24a30 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  n[pNew->u.btree.
24a40 6e 45 71 5d 3b 0a 20 20 20 20 69 52 6f 77 45 73  nEq];.    iRowEs
24a50 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
24a60 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  wEst[pNew->u.btr
24a70 65 65 2e 6e 45 71 2b 31 5d 3b 0a 20 20 7d 65 6c  ee.nEq+1];.  }el
24a80 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d  se{.    iCol = -
24a90 31 3b 0a 20 20 20 20 69 52 6f 77 45 73 74 20 3d  1;.    iRowEst =
24aa0 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20   1;.  }.  pTerm 
24ab0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
24ac0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
24ad0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
24ae0 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
24b10 65 29 3b 0a 20 20 73 61 76 65 64 4c 6f 6f 70 20  e);.  savedLoop 
24b20 3d 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d  = *pNew;.  pNew-
24b30 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c  >rSetup = (doubl
24b40 65 29 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  e)0;.  rLogSize 
24b50 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d  = estLog(pProbe-
24b60 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20  >aiRowEst[0]);. 
24b70 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
24b80 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
24b90 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
24ba0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
24bb0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 31  .    int nIn = 1
24bc0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24bd0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
24be0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
24bf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e  continue;.    pN
24c00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
24c10 76 65 64 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 3b  vedLoop.wsFlags;
24c20 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
24c30 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 4c 6f  ee.nEq = savedLo
24c40 6f 70 2e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  op.u.btree.nEq;.
24c50 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
24c60 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 54 65 72  = savedLoop.nTer
24c70 6d 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  m;.    if( pNew-
24c80 3e 6e 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72  >nTerm>=pBuilder
24c90 2d 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b  ->mxTerm ) break
24ca0 3b 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 6f  ; /* Repeated co
24cb0 6c 75 6d 6e 20 69 6e 20 69 6e 64 65 78 20 2a 2f  lumn in index */
24cc0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d  .    pNew->aTerm
24cd0 5b 70 4e 65 77 2d 3e 6e 54 65 72 6d 2b 2b 5d 20  [pNew->nTerm++] 
24ce0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
24cf0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
24d00 65 64 4c 6f 6f 70 2e 70 72 65 72 65 71 20 7c 20  edLoop.prereq | 
24d10 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
24d20 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
24d30 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 70  kSelf;.    if( p
24d40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
24d50 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
24d60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24d70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24d80 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
24d90 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
24da0 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
24db0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24dc0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
24dd0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
24de0 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
24df0 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74  ...)":  Assume t
24e00 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
24e10 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
24e20 20 20 20 20 20 6e 49 6e 20 3d 20 32 35 3b 0a 20       nIn = 25;. 
24e30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
24e40 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
24e50 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
24e60 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
24e70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
24e80 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
24e90 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
24ea0 20 20 20 6e 49 6e 20 3d 20 70 45 78 70 72 2d 3e     nIn = pExpr->
24eb0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
24ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
24ed0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
24ee0 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
24ef0 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 69 52  Out = (double)iR
24f00 6f 77 45 73 74 20 2a 20 6e 49 6e 4d 75 6c 20 2a  owEst * nInMul *
24f10 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
24f20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
24f30 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29  ator & (WO_EQ) )
24f40 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
24f50 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24f60 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
24f70 69 66 28 20 69 43 6f 6c 3c 30 20 0a 20 20 20 20  if( iCol<0 .    
24f80 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f     || (pProbe->o
24f90 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
24fa0 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 31 0a 20 20   && nInMul==1.  
24fb0 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
24fc0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70  ->u.btree.nEq==p
24fd0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  Probe->nColumn-1
24fe0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
24ff0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
25000 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
25010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25020 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
25030 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
25040 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29  >nOut = (double)
25050 69 52 6f 77 45 73 74 20 2a 20 6e 49 6e 4d 75 6c  iRowEst * nInMul
25060 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25070 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
25080 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29   & (WO_ISNULL) )
25090 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
250a0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
250b0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
250c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
250d0 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
250e0 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c  w->nOut = (doubl
250f0 65 29 69 52 6f 77 45 73 74 20 2a 20 6e 49 6e 4d  e)iRowEst * nInM
25100 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ul;.    }else if
25110 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
25120 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
25130 45 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  E) ){.      pNew
25140 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
25150 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
25160 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
25170 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
25180 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
25190 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
251a0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
251b0 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
251c0 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  LE) ){.      pNe
251d0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
251e0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
251f0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
25200 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
25210 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
25220 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
25230 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
25240 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25260 4e 65 77 2d 3e 61 54 65 72 6d 5b 70 4e 65 77 2d  New->aTerm[pNew-
25270 3e 6e 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  >nTerm-2] : 0;. 
25280 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 72     }.    pNew->r
25290 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 2a 6e  Run = rLogSize*n
252a0 49 6e 3b 20 20 2f 2a 20 43 6f 73 74 20 66 6f 72  In;  /* Cost for
252b0 20 6e 49 6e 20 62 69 6e 61 72 79 20 73 65 61 72   nIn binary sear
252c0 63 68 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ches */.    if( 
252d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
252e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
252f0 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
25300 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72  djust nOut and r
25310 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61  Run for STAT3 ra
25320 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  nge values */.  
25330 20 20 20 20 64 6f 75 62 6c 65 20 72 44 69 76 3b      double rDiv;
25340 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
25350 65 53 63 61 6e 45 73 74 28 70 42 75 69 6c 64 65  eScanEst(pBuilde
25360 72 2d 3e 70 50 61 72 73 65 2c 20 70 50 72 6f 62  r->pParse, pProb
25370 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  e, pNew->u.btree
25380 2e 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20  .nEq,.          
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
253a0 74 6d 2c 20 70 54 6f 70 2c 20 26 72 44 69 76 29  tm, pTop, &rDiv)
253b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
253c0 75 74 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 6e  ut = savedLoop.n
253d0 4f 75 74 2f 72 44 69 76 3b 0a 20 20 20 20 7d 0a  Out/rDiv;.    }.
253e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
253f0 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69  ABLE_STAT3.    i
25400 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  f( pNew->u.btree
25410 2e 6e 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62  .nEq==1 && pProb
25420 65 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  e->nSample ){.  
25430 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
25440 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
25450 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
25460 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25470 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
25480 45 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 50  Est(pBuilder->pP
25490 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54  arse, pProbe, pT
254a0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
254b0 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht,.            
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b     &pNew->nOut);
254e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
254f0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
25500 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20  or & WO_IN).    
25510 20 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78           &&  !Ex
25520 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
25530 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  erm->pExpr, EP_x
25540 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20  IsSelect)  ){.  
25550 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
25560 49 6e 53 63 61 6e 45 73 74 28 70 42 75 69 6c 64  InScanEst(pBuild
25570 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 50 72 6f  er->pParse, pPro
25580 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  be, pTerm->pExpr
25590 2d 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20  ->x.pList,.     
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255b0 20 20 20 20 20 20 20 20 26 70 4e 65 77 2d 3e 6e          &pNew->n
255c0 4f 75 74 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 20  Out);..      }. 
255d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
255e0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
255f0 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
25600 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 20 29  NLY|WHERE_IPK) )
25610 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  {.      pNew->rR
25620 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  un += pNew->nOut
25630 3b 20 20 2f 2a 20 55 6e 69 74 20 73 74 65 70 20  ;  /* Unit step 
25640 63 6f 73 74 20 74 6f 20 72 65 61 63 68 20 65 61  cost to reach ea
25650 63 68 20 72 6f 77 20 2a 2f 0a 20 20 20 20 7d 65  ch row */.    }e
25660 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61  lse{.      /* Ea
25670 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20  ch row involves 
25680 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e  a step of the in
25690 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61  dex, then a bina
256a0 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20  ry search of.   
256b0 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74     ** the main t
256c0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e  able */.      pN
256d0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 70 4e 65 77  ew->rRun += pNew
256e0 2d 3e 6e 4f 75 74 2a 28 31 20 2b 20 72 4c 6f 67  ->nOut*(1 + rLog
256f0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
25700 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20   /* TBD: Adjust 
25710 6e 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f  nOut for additio
25720 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nal constraints 
25730 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  */.    rc = wher
25740 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
25750 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
25760 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
25770 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
25780 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
25790 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
257a0 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<=pProbe->nCo
257b0 6c 75 6d 6e 0a 20 20 20 20 20 26 26 20 70 50 72  lumn.     && pPr
257c0 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 0a 20 20  obe->zName!=0.  
257d0 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
257e0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
257f0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
25800 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
25810 2a 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  *nIn);.    }.  }
25820 0a 20 20 2a 70 4e 65 77 20 3d 20 73 61 76 65 64  .  *pNew = saved
25830 4c 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 72  Loop;.  return r
25840 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
25850 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
25860 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
25870 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
25880 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
25890 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
258a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
258b0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
258c0 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
258d0 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
258e0 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
258f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
25900 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
25910 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
25920 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
25930 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
25940 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
25950 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
25960 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
25970 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
25980 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
25990 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
259a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
259b0 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
259c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
259d0 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
259e0 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20 28 70  nt ii;..  if( (p
259f0 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
25a00 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
25a10 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
25a20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
25a30 6e 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 69 3d 30  n[0];.  for(ii=0
25a40 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b  ; ii<pOB->nExpr;
25a50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   ii++){.    Expr
25a60 20 2a 70 45 78 70 72 20 3d 20 70 4f 42 2d 3e 61   *pExpr = pOB->a
25a70 5b 69 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  [ii].pExpr;.    
25a80 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
25a90 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
25aa0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78  n 0;.    if( pEx
25ab0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
25ac0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
25ad0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
25ae0 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31  =iCol ) return 1
25af0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
25b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25b10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25b20 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
25b30 6f 70 20 6f 62 6a 65 63 74 73 20 61 20 73 69 6e  op objects a sin
25b40 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
25b50 20 6a 6f 69 6e 20 77 65 72 65 20 74 68 65 20 74   join were the t
25b60 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
25b70 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
25b80 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
25b90 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
25ba0 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
25bb0 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
25bc0 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
25bd0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
25be0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
25bf0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
25c00 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25c10 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
25c20 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
25c30 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
25c40 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
25c50 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
25c60 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
25c70 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
25c80 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  ){.  Index *pPro
25c90 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
25ca0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
25cb0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
25cc0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
25cf0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
25d00 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
25d10 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
25d20 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
25d30 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
25d40 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
25d50 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
25d60 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
25d70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
25d80 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
25d90 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
25da0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
25db0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
25dc0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
25dd0 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
25de0 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
25df0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
25e00 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
25e10 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
25e20 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
25e30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25e40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25e50 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
25e60 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
25e70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
25e80 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
25eb0 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 64 6f  an value */.  do
25ec0 75 62 6c 65 20 72 53 69 7a 65 3b 20 20 20 20 20  uble rSize;     
25ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
25ee0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
25ef0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f  he table */.  do
25f00 75 62 6c 65 20 72 4c 6f 67 53 69 7a 65 3b 20 20  uble rLogSize;  
25f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
25f20 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
25f30 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
25f40 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 0a  the table */.  .
25f50 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
25f60 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
25f70 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62  = pBuilder->pTab
25f80 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
25f90 69 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  iTab;.  assert( 
25fa0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
25fb0 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
25fc0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
25fd0 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
25fe0 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
25ff0 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
26000 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
26010 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   */.    pProbe =
26020 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
26030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
26040 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
26050 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
26060 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
26070 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
26080 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
26090 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
260a0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
260b0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
260c0 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
260d0 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
260e0 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
260f0 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
26100 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
26110 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
26120 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
26130 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
26140 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
26150 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
26160 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
26170 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
26180 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
26190 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
261a0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
261b0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
261c0 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
261d0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
261e0 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
261f0 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
26200 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
26210 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
26220 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
26230 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
26240 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70  tPk[0] = pSrc->p
26250 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
26260 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
26270 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
26280 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
26290 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
262a0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
262b0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
262c0 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
262d0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
262e0 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
262f0 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
26300 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
26310 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
26320 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
26330 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
26340 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
26350 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
26360 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
26370 20 20 72 53 69 7a 65 20 3d 20 28 64 6f 75 62 6c    rSize = (doubl
26380 65 29 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  e)pSrc->pTab->nR
26390 6f 77 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  owEst;.  rLogSiz
263a0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
263b0 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  );..  /* Automat
263c0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
263d0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
263e0 42 65 73 74 0a 20 20 20 26 26 20 28 70 42 75 69  Best.   && (pBui
263f0 6c 64 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lder->pParse->db
26400 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
26410 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 20 0a  _AutoIndex)!=0 .
26420 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61     && !pSrc->via
26430 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20  Coroutine.   && 
26440 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65  !pSrc->notIndexe
26450 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69  d.   && !pSrc->i
26460 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 29 7b  sCorrelated.  ){
26470 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
26480 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
26490 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
264a0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
264b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
264c0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
264d0 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
264e0 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
264f0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
26500 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
26510 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
26520 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
26530 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
26540 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
26550 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
26560 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
26570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26580 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
26590 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
265a0 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
265b0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
265c0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
265d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
265e0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
265f0 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
26600 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
26610 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54  w->aTerm[0] = pT
26620 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  erm;.        pNe
26630 77 2d 3e 72 53 65 74 75 70 20 3d 20 32 30 2a 72  w->rSetup = 20*r
26640 4c 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70 54  LogSize*pSrc->pT
26650 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
26660 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
26670 3d 20 28 64 6f 75 62 6c 65 29 31 30 3b 0a 20 20  = (double)10;.  
26680 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
26690 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 70 4e   = rLogSize + pN
266a0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  ew->nOut;.      
266b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
266c0 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
266d0 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
266e0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
266f0 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
26700 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
26710 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
26720 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
26730 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
26740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f    }.  }..  /* Lo
26750 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
26760 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
26770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26780 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
26790 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
267a0 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
267b0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
267c0 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
267d0 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  ->nTerm = 0;.   
267e0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
267f0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
26800 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65 29  Setup = (double)
26810 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
26820 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
26830 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26840 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
26850 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
26860 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
26870 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
26880 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
26890 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  or);.    if( pPr
268a0 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
268b0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
268c0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
268d0 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
268e0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
268f0 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
26900 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
26910 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
26920 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
26930 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
26940 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
26950 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 4e 65  rSize;.      pNe
26960 77 2d 3e 72 52 75 6e 20 3d 20 28 72 53 69 7a 65  w->rRun = (rSize
26970 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28 33 2b   + rLogSize)*(3+
26980 62 29 3b 20 2f 2a 20 34 78 20 70 65 6e 61 6c 74  b); /* 4x penalt
26990 79 20 66 6f 72 20 61 20 66 75 6c 6c 2d 73 63 61  y for a full-sca
269a0 6e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  n */.      rc = 
269b0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
269c0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
269d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
269e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
269f0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
26a00 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
26a10 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  d;.      int j;.
26a20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 50 72 6f        for(j=pPro
26a30 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  be->nColumn-1; j
26a40 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
26a50 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62     int x = pProb
26a60 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  e->aiColumn[j];.
26a70 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d          if( x<BM
26a80 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S-1 ){.         
26a90 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73   m &= ~(((Bitmas
26aa0 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20  k)1)<<x);.      
26ab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26ac0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26ad0 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
26ae0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
26af0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
26b00 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
26b10 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
26b20 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
26b30 20 20 69 66 28 20 28 6d 3d 3d 30 20 7c 7c 20 62    if( (m==0 || b
26b40 29 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e  ) && pProbe->bUn
26b50 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20  ordered==0 ){.  
26b60 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
26b70 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
26b80 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  Idx : 0;.       
26b90 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
26ba0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ize;.        pNe
26bb0 77 2d 3e 72 52 75 6e 20 3d 20 28 6d 3d 3d 30 29  w->rRun = (m==0)
26bc0 20 3f 20 28 72 53 69 7a 65 20 2b 20 72 4c 6f 67   ? (rSize + rLog
26bd0 53 69 7a 65 29 2a 28 31 2b 62 29 20 3a 20 28 72  Size)*(1+b) : (r
26be0 53 69 7a 65 2a 72 4c 6f 67 53 69 7a 65 29 3b 0a  Size*rLogSize);.
26bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
26c00 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
26c10 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
26c20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
26c30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26c40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 68 65    }.    rc = whe
26c50 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
26c60 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
26c70 72 63 2c 20 70 50 72 6f 62 65 2c 20 31 29 3b 0a  rc, pProbe, 1);.
26c80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
26c90 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
26ca0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
26cb0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
26cc0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
26cd0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
26ce0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
26cf0 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
26d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26d10 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
26d20 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
26d30 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
26d40 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
26d50 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
26d60 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
26d70 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
26d80 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
26d90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
26da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26db0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
26dc0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
26dd0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
26de0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
26df0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
26e00 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e20 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
26e30 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
26e40 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
26e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e70 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
26e80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26e90 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
26ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26eb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
26ec0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26ed0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
26ee0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
26ef0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
26f00 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
26f10 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
26f20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
26f30 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
26f40 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
26f50 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
26f60 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
26f70 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
26f80 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
26f90 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
26fa0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26fb0 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
26fc0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
26fd0 65 72 6d 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  erm;.  int seenI
26fe0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
26ff0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
27000 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
27010 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
27020 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
27030 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27040 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
27050 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
27060 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
27070 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
27080 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
27090 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
270a0 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
270b0 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
270c0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
270d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
270e0 3b 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 42  ;..  pParse = pB
270f0 75 69 6c 64 65 72 2d 3e 70 50 61 72 73 65 3b 0a  uilder->pParse;.
27100 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
27110 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
27120 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
27130 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
27140 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 42 75  w;.  pSrc = &pBu
27150 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 2d  ilder->pTabList-
27160 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
27170 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
27180 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
27190 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
271a0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
271b0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
271c0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
271d0 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
271e0 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
271f0 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
27200 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27210 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
27220 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
27230 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
27240 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
27250 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
27260 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20    pNew->nTerm = 
27270 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
27280 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
27290 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49    pUsage = pIdxI
272a0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
272b0 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 50  Usage;..  for(iP
272c0 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d  hase=0; iPhase<=
272d0 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20  3; iPhase++){.  
272e0 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26    if( !seenIn &&
272f0 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29   (iPhase&1)!=0 )
27300 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b  {.      iPhase++
27310 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61  ;.      if( iPha
27320 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>3 ) break;.  
27330 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
27340 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31  nVar && iPhase>1
27350 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
27360 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
27370 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
27380 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
27390 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
273a0 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  int;.    for(i=0
273b0 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
273c0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
273d0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
273e0 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
273f0 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
27400 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
27410 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77  ->a[j];.      sw
27420 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a  itch( iPhase ){.
27430 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20          case 0: 
27440 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
27450 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61  without IN opera
27460 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
27470 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27480 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27490 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
274a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
274b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
274c0 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20    seenIn = 1;.  
274d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
274e0 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
274f0 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  ight!=0 ){.     
27500 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d         seenVar =
27510 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
27520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27530 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27540 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
27550 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
27560 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
27570 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
27580 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
27590 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
275a0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
275b0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
275c0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
275d0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
275e0 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
275f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27600 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
27610 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
27620 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
27630 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
27640 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
27650 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27660 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
27670 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
27680 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
27690 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
276a0 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
276b0 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
276c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
276d0 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
276e0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
276f0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
27700 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27710 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27720 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
27730 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
27740 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
27750 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
27760 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
27770 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
27780 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
27790 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
277a0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
277b0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
277c0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
277d0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
277e0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
277f0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
27800 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27810 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
27820 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 28 28 64 6f  = 0;.    /* ((do
27830 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20  uble)2) In case 
27840 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
27850 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
27860 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   */.    pIdxInfo
27870 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
27880 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
27890 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a   / ((double)2);.
278a0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
278b0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
278c0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
278d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
278e0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
278f0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
27900 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
27910 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
27920 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
27930 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
27940 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
27950 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78  ereq = 0;.    mx
27960 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 66  Term = -1;.    f
27970 6f 72 28 69 3d 30 3b 20 69 3c 70 42 75 69 6c 64  or(i=0; i<pBuild
27980 65 72 2d 3e 6d 78 54 65 72 6d 3b 20 69 2b 2b 29  er->mxTerm; i++)
27990 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 5d 20   pNew->aTerm[i] 
279a0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
279b0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
279c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
279d0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
279e0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
279f0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
27a00 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
27a10 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
27a20 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
27a30 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
27a40 3d 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72  =pBuilder->mxTer
27a50 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
27a60 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
27a70 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
27a80 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
27a90 3d 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  =pIdxInfo->nCons
27aa0 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
27ab0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
27ac0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
27ad0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
27ae0 77 2d 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d 21  w->aTerm[iTerm]!
27af0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
27b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27b10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27b30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
27b40 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61  .xBestIndex() ma
27b50 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62  lfunction", pTab
27b60 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
27b70 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
27b80 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
27b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ba0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
27bb0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
27bc0 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
27bd0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27be0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27bf0 61 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  aTerm[iTerm] = p
27c00 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
27c10 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
27c20 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
27c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
27c40 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
27c50 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
27c60 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
27c70 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
27c80 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
27c90 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
27ca0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
27cb0 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
27cc0 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
27cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
27ce0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
27cf0 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
27d00 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
27d10 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
27d20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
27d30 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
27d40 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
27d50 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
27d60 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
27d70 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
27d80 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
27d90 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
27da0 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
27db0 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
27dc0 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
27dd0 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
27de0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
27df0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27e00 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
27e10 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
27e20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
27e30 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
27e40 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
27e50 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
27e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
27e70 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
27e80 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
27e90 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
27ea0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
27eb0 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
27ec0 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
27ed0 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
27ee0 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
27ef0 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
27f00 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
27f10 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
27f20 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
27f30 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
27f40 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
27f50 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
27f60 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
27f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27f80 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 49 6e     if( i>=pIdxIn
27f90 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
27fa0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
27fb0 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
27fc0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
27fd0 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
27fe0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
27ff0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
28000 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
28010 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
28020 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
28030 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
28040 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
28050 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
28060 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
28070 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
28080 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
28090 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29  isOrdered = (u8)
280a0 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  ((pIdxInfo->nOrd
280b0 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20  erBy!=0).       
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
280e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
280f0 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20  ByConsumed);.   
28100 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
28110 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20  = (double)0;.   
28120 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
28130 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
28140 74 65 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70  tedCost;.      p
28150 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75  New->nOut = (dou
28160 62 6c 65 29 32 35 3b 0a 20 20 20 20 20 20 77 68  ble)25;.      wh
28170 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
28180 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
28190 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75       if( pNew->u
281a0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
281b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
281c0 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
281d0 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
281e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
281f0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
28200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28210 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64  }  ..whereLoopAd
28220 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66  dVtab_exit:.  if
28230 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
28240 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
28250 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
28260 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
28270 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
28280 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
28290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
282a0 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
282b0 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
282c0 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
282d0 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
282e0 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
282f0 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
28300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28310 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57  whereLoopAddOr(W
28320 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
28330 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61  *pBuilder, Bitma
28340 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68  sk mExtra){.  Wh
28350 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
28360 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
28370 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  w;.  WhereTerm *
28380 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a  pTerm, *pWCEnd;.
28390 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
283a0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72  E_OK;.  int iCur
283b0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
283c0 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  tempWC;.  WhereL
283d0 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42  oopBuilder sSubB
283e0 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  uild;.  WhereLoo
283f0 70 20 73 42 65 73 74 3b 0a 20 20 73 74 72 75 63  p sBest;.  struc
28400 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28410 70 49 74 65 6d 3b 0a 20 20 0a 0a 20 20 70 57 43  pItem;.  ..  pWC
28420 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
28430 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74  ;.  if( pWC->wct
28440 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28450 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72  AND_ONLY ) retur
28460 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
28470 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
28480 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
28490 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
284a0 70 4e 65 77 3b 0a 20 20 70 49 74 65 6d 20 3d 20  pNew;.  pItem = 
284b0 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69  pBuilder->pTabLi
284c0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
284d0 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
284e0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 73  em->iCursor;.  s
284f0 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
28500 6c 64 65 72 3b 0a 20 20 73 53 75 62 42 75 69 6c  lder;.  sSubBuil
28510 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
28520 20 20 73 53 75 62 42 75 69 6c 64 2e 70 42 65 73    sSubBuild.pBes
28530 74 20 3d 20 26 73 42 65 73 74 3b 0a 20 20 74 65  t = &sBest;.  te
28540 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57  mpWC.pParse = pW
28550 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 74 65 6d  C->pParse;.  tem
28560 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70  pWC.pMaskSet = p
28570 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
28580 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
28590 70 57 43 3b 0a 20 20 74 65 6d 70 57 43 2e 6f 70  pWC;.  tempWC.op
285a0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 74 65 6d   = TK_AND;.  tem
285b0 70 57 43 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d  pWC.wctrlFlags =
285c0 20 30 3b 0a 20 20 74 65 6d 70 57 43 2e 6e 54 65   0;.  tempWC.nTe
285d0 72 6d 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 70  rm = 1;..  for(p
285e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
285f0 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d  rm<pWCEnd && rc=
28600 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72  =SQLITE_OK; pTer
28610 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
28620 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28630 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20  & WO_OR)!=0.    
28640 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f   && (pTerm->u.pO
28650 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
28660 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
28670 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  f)!=0 .    ){.  
28680 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
28690 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
286a0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
286b0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
286c0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
286d0 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
286e0 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
286f0 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
28700 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
28710 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c     double rTotal
28720 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62   = 0;.      doub
28730 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20  le nRow = 0;.   
28740 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
28750 71 20 3d 20 6d 45 78 74 72 61 3b 0a 0a 0a 20 20  q = mExtra;...  
28760 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
28770 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
28780 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
28790 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
287a0 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
287b0 70 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29  perator& WO_AND)
287c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
287d0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
287e0 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
287f0 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
28800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
28810 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
28820 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
28830 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
28840 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
28850 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
28860 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
28870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28880 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
288a0 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d  sBest.maskSelf =
288b0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
288c0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
288d0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
288e0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
288f0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
28900 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
28910 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28920 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28930 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
28940 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  e(&sSubBuild, mE
28950 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
28960 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 42 65  .        if( sBe
28970 73 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29  st.maskSelf==0 )
28980 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28990 61 73 73 65 72 74 28 20 73 42 65 73 74 2e 72 53  assert( sBest.rS
289a0 65 74 75 70 3d 3d 28 64 6f 75 62 6c 65 29 30 20  etup==(double)0 
289b0 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61  );.        rTota
289c0 6c 20 2b 3d 20 73 42 65 73 74 2e 72 52 75 6e 3b  l += sBest.rRun;
289d0 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
289e0 20 73 42 65 73 74 2e 6e 4f 75 74 3b 0a 20 20 20   sBest.nOut;.   
289f0 20 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73       prereq |= s
28a00 42 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20  Best.prereq;.   
28a10 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
28a20 3e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  >nTerm = 1;.    
28a30 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d    pNew->aTerm[0]
28a40 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
28a50 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
28a60 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
28a70 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
28a80 75 70 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a  up = (double)0;.
28a90 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
28aa0 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = rTotal;.     
28ab0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
28ac0 6f 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ow;.      pNew->
28ad0 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71 3b  prereq = prereq;
28ae0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
28af0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
28b00 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
28b10 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28b20 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
28b30 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20  , pNew);.    }. 
28b40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28b50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
28b60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
28b70 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
28b80 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
28b90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
28ba0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
28bb0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
28bc0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d  Bitmask mExtra =
28bd0 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
28be0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
28bf0 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
28c00 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69  *pTabList = pBui
28c10 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  lder->pTabList;.
28c20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28c30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
28c40 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
28c50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
28c60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
28c70 3d 20 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a  = pBuilder->db;.
28c80 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d    int nTabList =
28c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28ca0 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  o->nLevel;.  int
28cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28cc0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
28cd0 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ew;..  /* Loop o
28ce0 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
28cf0 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
28d00 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
28d10 2f 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  /.  pBuilder->pN
28d20 65 77 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69  ew = pNew = sqli
28d30 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
28d40 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
28d50 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e  Loop));.  if( pN
28d60 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
28d70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
28d80 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20  Builder->mxTerm 
28d90 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 31 3b 0a  = pWC->nTerm+1;.
28da0 20 20 77 68 69 6c 65 28 20 70 57 43 2d 3e 70 4f    while( pWC->pO
28db0 75 74 65 72 20 29 7b 0a 20 20 20 20 70 57 43 20  uter ){.    pWC 
28dc0 3d 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20  = pWC->pOuter;. 
28dd0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54     pBuilder->mxT
28de0 65 72 6d 20 2b 3d 20 70 57 43 2d 3e 6e 54 65 72  erm += pWC->nTer
28df0 6d 3b 0a 20 20 7d 0a 20 20 70 57 43 20 3d 20 70  m;.  }.  pWC = p
28e00 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
28e10 70 4e 65 77 2d 3e 61 54 65 72 6d 20 3d 20 73 71  pNew->aTerm = sq
28e20 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
28e30 6f 28 64 62 2c 70 42 75 69 6c 64 65 72 2d 3e 6d  o(db,pBuilder->m
28e40 78 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 4e 65  xTerm*sizeof(pNe
28e50 77 2d 3e 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  w->aTerm[0]));. 
28e60 20 69 66 28 20 70 4e 65 77 2d 3e 61 54 65 72 6d   if( pNew->aTerm
28e70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
28e80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28e90 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
28ea0 41 64 64 41 6c 6c 5f 65 6e 64 3b 0a 20 20 7d 0a  AddAll_end;.  }.
28eb0 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
28ec0 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
28ed0 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20   iTab<nTabList; 
28ee0 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
28ef0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  {.    pNew->iTab
28f00 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
28f10 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  w->maskSelf = ge
28f20 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
28f30 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
28f40 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 70  sor);.    if( (p
28f50 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
28f60 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
28f70 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
28f80 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
28f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28fa0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
28fb0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
28fc0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
28fd0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
28fe0 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
28ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
29000 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
29010 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ree(pBuilder, mE
29020 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
29030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29050 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
29060 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
29070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72  );.    }.    mPr
29080 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73  ior |= pNew->mas
29090 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72  kSelf;.    if( r
290a0 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  c || db->mallocF
290b0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
290c0 20 7d 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   }.whereLoopAddA
290d0 6c 6c 5f 65 6e 64 3a 0a 20 20 77 68 65 72 65 4c  ll_end:.  whereL
290e0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 42  oopDelete(db, pB
290f0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 29 3b 0a 20  uilder->pNew);. 
29100 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20   pBuilder->pNew 
29110 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
29120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
29130 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
29140 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
29150 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
29160 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
29170 34 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  4th.** parameter
29180 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
29190 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
291a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
291b0 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
291c0 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
291d0 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
291e0 72 61 74 65 20 73 6f 75 72 63 65 20 6f 70 65 72  rate source oper
291f0 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a  ation.  Return:.
29200 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52  ** .**    0:  OR
29210 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61  DER BY is not sa
29220 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e  tisfied.  Sortin
29230 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20  g required.**   
29240 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73   1:  ORDER BY is
29250 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20   satisfied.     
29260 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a   Omit sorting.**
29270 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20     -1:  Unknown 
29280 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a  at this time.**.
29290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
292a0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
292b0 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
292c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
292d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
292e0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 50  ause */.  WhereP
292f0 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
29300 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
29310 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
29320 6e 74 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  nt nLoop,       
29330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29340 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
29350 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
29360 20 69 6e 74 20 69 73 4c 61 73 74 4c 6f 6f 70 2c   int isLastLoop,
29370 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
29380 6f 72 20 74 68 65 20 76 65 72 79 20 6c 61 73 74  or the very last
29390 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
293a0 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
293b0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
293c0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
293d0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
293e0 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
293f0 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
29400 2a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  * Mask of WhereL
29410 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
29420 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
29430 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
29440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29450 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
29460 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29480 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
29490 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
294a0 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
294b0 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
294c0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
294d0 6e 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20  neRow;          
294e0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
294f0 4c 6f 6f 70 20 69 73 20 61 20 6f 6e 65 2d 72 6f  Loop is a one-ro
29500 77 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 72  w loop */.  u8 r
29510 65 71 75 69 72 65 4f 6e 65 52 6f 77 20 3d 20 30  equireOneRow = 0
29520 3b 20 2f 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ; /* All subsequ
29530 65 6e 74 20 6c 6f 6f 70 73 20 6d 75 73 74 20 62  ent loops must b
29540 65 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 20 20 75  e one-row */.  u
29550 38 20 69 73 55 6e 69 71 75 65 49 64 78 3b 20 20  8 isUniqueIdx;  
29560 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
29570 57 68 65 72 65 4c 6f 6f 70 20 75 73 65 73 20 61  WhereLoop uses a
29580 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 2a 2f   unique index */
29590 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 0a  .  u16 nColumn;.
295a0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 0a    u16 nOrderBy;.
295b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
295c0 74 20 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 69  t nUsed = 0;.  i
295d0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
295e0 43 6f 6c 75 6d 6e 3b 0a 20 20 57 68 65 72 65 4c  Column;.  WhereL
295f0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 45 78  oop *pLoop;.  Ex
29600 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
29610 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65   = pWInfo->pOrde
29620 72 42 79 3b 0a 20 20 45 78 70 72 20 2a 70 4f 42  rBy;.  Expr *pOB
29630 45 78 70 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  Expr;.  CollSeq 
29640 2a 70 43 6f 6c 6c 3b 0a 20 20 49 6e 64 65 78 20  *pColl;.  Index 
29650 2a 70 49 6e 64 65 78 3b 0a 20 20 73 71 6c 69 74  *pIndex;.  sqlit
29660 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
29670 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 42  >pParse->db;.  B
29680 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
29690 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   0;..  /*.  ** W
296a0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
296b0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
296c0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
296d0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
296e0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
296f0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
29700 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
29710 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
29720 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
29730 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 0a 20 20  s unique.  **.  
29740 2a 2a 20 47 65 6e 65 72 61 6c 20 72 75 6c 65 73  ** General rules
29750 3a 20 20 28 6e 6f 74 20 61 6e 20 61 6c 67 6f 72  :  (not an algor
29760 69 74 68 6d 21 29 0a 20 20 2a 2a 0a 20 20 2a 2a  ithm!).  **.  **
29770 20 20 28 31 29 20 49 66 20 74 68 65 20 63 75 72    (1) If the cur
29780 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 69  rent WhereLoop i
29790 73 20 6f 6e 65 2d 72 6f 77 2c 20 74 68 65 6e 20  s one-row, then 
297a0 6d 61 74 63 68 20 6f 76 65 72 20 61 6e 79 20 61  match over any a
297b0 6e 64 20 61 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  nd all.  **     
297c0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
297d0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
297e0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 70 72  WhereLoop and pr
297f0 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78  oceed to the nex
29800 74 0a 20 20 2a 2a 20 20 20 20 20 20 57 68 65 72  t.  **      Wher
29810 65 4c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eLoop..  **.  **
29820 20 20 28 32 29 20 49 66 20 74 68 65 20 63 75 72    (2) If the cur
29830 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 69  rent WhereLoop i
29840 73 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 2c 20 74  s not one-row, t
29850 68 65 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hen all subseque
29860 6e 74 0a 20 20 2a 2a 20 20 20 20 20 20 57 68 65  nt.  **      Whe
29870 72 65 4c 6f 6f 70 73 20 6d 75 73 74 20 62 65 20  reLoops must be 
29880 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 0a 20 20  one-row..  **.  
29890 2a 2a 20 20 28 33 29 20 4f 70 74 69 6f 6e 61 6c  **  (3) Optional
298a0 6c 79 20 6d 61 74 63 68 20 61 6e 79 20 4f 52 44  ly match any ORD
298b0 45 52 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  ER BY terms agai
298c0 6e 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 45  nst the first nE
298d0 71 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 20  q columns.  **  
298e0 20 20 20 20 6f 66 20 74 68 65 20 69 6e 64 65 78      of the index
298f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 28 34 29  ..  **.  **  (4)
29900 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 70   Index columns p
29910 61 73 74 20 6e 45 71 20 6d 75 73 74 20 6d 61 74  ast nEq must mat
29920 63 68 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ch ORDER BY term
29930 73 20 6f 6e 65 2d 66 6f 72 2d 6f 6e 65 2e 0a 20  s one-for-one.. 
29940 20 2a 2a 0a 20 20 2a 2a 20 20 28 35 29 20 49 66   **.  **  (5) If
29950 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
29960 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 68  a UNIQUE index h
29970 61 76 65 20 62 65 65 6e 20 6d 61 74 63 68 65 64  ave been matched
29980 20 61 67 61 69 6e 73 74 20 4f 52 44 45 52 20 42   against ORDER B
29990 59 0a 20 20 2a 2a 20 20 20 20 20 20 74 65 72 6d  Y.  **      term
299a0 73 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 73  s, then any subs
299b0 65 71 75 65 6e 74 20 65 6e 74 72 69 65 73 20 69  equent entries i
299c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
299d0 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 74 68  lause against th
299e0 65 0a 20 20 2a 2a 20 20 20 20 20 20 73 61 6d 65  e.  **      same
299f0 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20 73 6b   table can be sk
29a00 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 0a 20 20 61  ipped..  */..  a
29a10 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
29a20 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
29a30 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
29a40 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
29a50 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
29a60 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
29a70 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
29a80 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
29a90 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
29aa0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29ab0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
29ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  {.    assert( nL
29ad0 6f 6f 70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  oop==0 );.    re
29ae0 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74  turn pLast->u.vt
29af0 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  ab.isOrdered;.  
29b00 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  }..  /* Sorting 
29b10 69 73 20 61 6c 77 61 79 73 20 72 65 71 75 69 72  is always requir
29b20 65 64 20 69 66 20 61 6e 79 20 74 65 72 6d 20 6f  ed if any term o
29b30 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 69  f the ORDER BY i
29b40 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 63 6f  s not a .  ** co
29b50 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 2a  lumn reference *
29b60 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  /.  nOrderBy = p
29b70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
29b80 23 69 66 20 30 0a 20 20 66 6f 72 28 69 3d 30 3b  #if 0.  for(i=0;
29b90 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
29ba0 29 7b 0a 20 20 20 20 70 4f 42 45 78 70 72 20 3d  ){.    pOBExpr =
29bb0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
29bc0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
29bd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
29be0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
29bf0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
29c00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
29c10 6e 64 69 66 0a 20 20 20 20 0a 20 20 66 6f 72 28  ndif.    .  for(
29c20 69 3d 30 3b 20 69 3c 3d 6e 4c 6f 6f 70 20 26 26  i=0; i<=nLoop &&
29c30 20 6e 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b   nUsed<nOrderBy;
29c40 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 6f 6f 70   i++){.    pLoop
29c50 20 3d 20 69 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61   = i<nLoop ? pPa
29c60 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 20 3a 20 70  th->aLoop[i] : p
29c70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Last;.    assert
29c80 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
29c90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
29ca0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
29cb0 20 20 69 73 4f 6e 65 52 6f 77 20 3d 20 69 73 55    isOneRow = isU
29cc0 6e 69 71 75 65 49 64 78 20 3d 20 31 3b 0a 20 20  niqueIdx = 1;.  
29cd0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
29ce0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
29cf0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
29d00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
29d10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
29d20 21 3d 30 20 29 20 69 73 4f 6e 65 52 6f 77 20 3d  !=0 ) isOneRow =
29d30 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   0;.      if( pL
29d40 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
29d50 21 3d 31 20 29 20 69 73 4f 6e 65 52 6f 77 20 3d  !=1 ) isOneRow =
29d60 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   0;.      pIndex
29d70 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6c   = 0;.      nCol
29d80 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  umn = 0;.    }el
29d90 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
29da0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
29db0 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
29dc0 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
29dd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29de0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
29df0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
29e00 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
29e10 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
29e20 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
29e30 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ne ){.        is
29e40 4f 6e 65 52 6f 77 20 3d 20 69 73 55 6e 69 71 75  OneRow = isUniqu
29e50 65 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  eIdx = 0;.      
29e60 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70  }else if( (pLoop
29e70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
29e80 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
29e90 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a  RE_COLUMN_RANGE.
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e     |WHERE_COLUMN
29ed0 5f 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  _NULL))!=0 ){.  
29ee0 20 20 20 20 20 20 69 73 4f 6e 65 52 6f 77 20 3d        isOneRow =
29ef0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
29f00 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  if( pLoop->u.btr
29f10 65 65 2e 6e 45 71 20 3c 20 70 49 6e 64 65 78 2d  ee.nEq < pIndex-
29f20 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
29f30 20 20 20 20 69 73 4f 6e 65 52 6f 77 20 3d 20 30      isOneRow = 0
29f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29f50 20 20 20 20 69 66 28 20 21 69 73 4f 6e 65 52 6f      if( !isOneRo
29f60 77 20 26 26 20 72 65 71 75 69 72 65 4f 6e 65 52  w && requireOneR
29f70 6f 77 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ow ) return 0;. 
29f80 20 20 20 72 65 71 75 69 72 65 4f 6e 65 52 6f 77     requireOneRow
29f90 20 3d 20 21 69 73 4f 6e 65 52 6f 77 3b 0a 20 20   = !isOneRow;.  
29fa0 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
29fb0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
29fc0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
29fd0 72 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  r;.    j = 0;.  
29fe0 20 20 72 65 76 53 65 74 20 3d 20 72 65 76 20 3d    revSet = rev =
29ff0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
2a000 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e   j<=nColumn && n
2a010 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  Used<nOrderBy; j
2a020 2b 2b 2c 20 6e 55 73 65 64 2b 2b 29 7b 0a 20 20  ++, nUsed++){.  
2a030 20 20 20 20 69 6e 74 20 73 6b 69 70 61 62 6c 65      int skipable
2a040 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2a050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2a060 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2a070 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e 70 45 78 70  y->a[nUsed].pExp
2a080 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2a090 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2a0a0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
2a0b0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2a0c0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2a0d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a0e0 69 66 28 20 69 73 4f 6e 65 52 6f 77 20 29 7b 20  if( isOneRow ){ 
2a0f0 6a 2d 2d 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  j--; continue; }
2a100 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f  .      if( j<nCo
2a110 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2a120 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20  /* Normal index 
2a130 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
2a140 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
2a150 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
2a160 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78  ;.        revIdx
2a170 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2a180 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2a190 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
2a1a0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
2a1b0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
2a1c0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
2a1d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2a1e0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74   ROWID column at
2a1f0 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20   the end */.    
2a200 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
2a210 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78  ;.        revIdx
2a220 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2a230 20 20 20 20 73 6b 69 70 61 62 6c 65 20 3d 20 6a      skipable = j
2a240 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
2a250 6e 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 54  nEq && pLoop->aT
2a260 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
2a270 72 21 3d 57 4f 5f 49 4e 3b 0a 20 20 20 20 20 20  r!=WO_IN;.      
2a280 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
2a290 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn!=iColumn ){
2a2a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 6b 69  .        if( ski
2a2b0 70 61 62 6c 65 20 29 7b 20 6e 55 73 65 64 2d 2d  pable ){ nUsed--
2a2c0 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20  ; continue; }.  
2a2d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a2f0 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
2a300 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2a310 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2a320 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2a330 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e  e, pOrderBy->a[n
2a340 55 73 65 64 5d 2e 70 45 78 70 72 29 3b 0a 20 20  Used].pExpr);.  
2a350 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2a360 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2a370 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2a380 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2a390 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2a3a0 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2a3b0 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[j])!=0 ){.    
2a3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a3e0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  }.      if( !ski
2a3f0 70 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pable ){.       
2a400 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
2a410 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
2a420 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
2a430 64 65 72 42 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e  derBy->a[nUsed].
2a440 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2a450 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 0;.        }e
2a460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2a470 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f  ev = revIdx ^ pO
2a480 72 64 65 72 42 79 2d 3e 61 5b 6e 55 73 65 64 5d  rderBy->a[nUsed]
2a490 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
2a4a0 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
2a4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a4c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
2a4d0 3d 6e 43 6f 6c 75 6d 6e 2d 31 20 26 26 20 69 73  =nColumn-1 && is
2a4e0 55 6e 69 71 75 65 49 64 78 20 29 7b 0a 20 20 20  UniqueIdx ){.   
2a4f0 20 20 20 20 20 69 66 28 20 69 73 4c 61 73 74 4c       if( isLastL
2a500 6f 6f 70 20 26 26 20 69 3d 3d 6e 4c 6f 6f 70 20  oop && i==nLoop 
2a510 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2a520 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 73   j--;.        is
2a530 4f 6e 65 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  OneRow = 1;.    
2a540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2a550 28 20 72 65 76 20 29 20 72 65 76 4d 61 73 6b 20  ( rev ) revMask 
2a560 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
2a570 3c 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  <i;.  }.  if( is
2a580 4c 61 73 74 4c 6f 6f 70 20 7c 7c 20 6e 55 73 65  LastLoop || nUse
2a590 64 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  d==nOrderBy ){. 
2a5a0 20 20 20 2a 70 52 65 76 4d 61 73 6b 20 3d 20 72     *pRevMask = r
2a5b0 65 76 4d 61 73 6b 3b 0a 20 20 20 20 72 65 74 75  evMask;.    retu
2a5c0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2a5d0 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn -1;.}..#ifdef
2a5e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2a5f0 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
2a600 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
2a610 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2a620 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
2a630 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
2a640 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
2a650 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2a660 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
2a670 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
2a680 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2a690 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
2a6a0 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
2a6b0 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
2a6c0 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
2a6d0 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
2a6e0 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
2a6f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
2a700 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
2a710 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  f.../*.** Given 
2a720 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
2a730 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e  eLoop objects on
2a740 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
2a750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a760 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
2a770 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
2a780 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
2a790 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
2a7a0 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
2a7b0 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
2a7c0 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
2a7d0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
2a7e0 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 52   fields..**.** R
2a7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2a800 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
2a810 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
2a820 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2a830 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
2a840 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a850 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
2a860 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2a870 66 6f 2c 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45  fo, double nRowE
2a880 73 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  st){.  const int
2a890 20 6d 78 43 68 6f 69 63 65 20 3d 20 31 30 3b 20   mxChoice = 10; 
2a8a0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2a8b0 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
2a8c0 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
2a8d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2a900 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
2a910 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a930 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
2a940 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
2a950 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
2a960 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2a970 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
2a980 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
2a990 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
2a9a0 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
2a9b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a9c0 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  rs */.  double r
2a9d0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
2a9e0 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70    /* Cost of a p
2a9f0 61 74 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ath */.  double 
2aa00 6d 78 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  mxCost;         
2aa10 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
2aa20 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
2aa30 61 74 68 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  aths */.  double
2aa40 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20   rSortCost;     
2aa50 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64      /* Cost to d
2aa60 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e  o a sort */.  in
2aa70 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
2aa80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2aa90 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
2aaa0 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
2aab0 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
2aac0 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
2aad0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
2aae0 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
2aaf0 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
2ab00 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2ab10 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
2ab20 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
2ab30 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
2ab40 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
2ab50 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
2ab60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2ab70 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
2ab80 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
2ab90 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
2aba0 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
2abb0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2abc0 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
2abd0 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
2abe0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
2abf0 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
2ac00 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2ac10 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2ac20 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
2ac30 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
2ac40 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
2ac50 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
2ac60 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68  e memory */.  ch
2ac70 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
2ac80 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
2ac90 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
2aca0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2acb0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 57 49 6e   */..  db = pWIn
2acc0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
2acd0 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
2ace0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 61 73 73 65  ->nLevel;.  asse
2acf0 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
2ad00 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
2ad10 63 20 29 3b 0a 23 69 66 64 65 66 20 57 48 45 52  c );.#ifdef WHER
2ad20 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2ad30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2ad40 65 54 72 61 63 65 3e 3d 32 20 29 20 73 71 6c 69  eTrace>=2 ) sqli
2ad50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2ad60 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
2ad70 72 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  r\n");.#endif.. 
2ad80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2ad90 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
2ada0 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
2adb0 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
2adc0 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
2add0 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
2ade0 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
2adf0 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
2ae00 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2ae10 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
2ae20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
2ae30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ae40 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
2ae50 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
2ae60 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
2ae70 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
2ae80 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
2ae90 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
2aea0 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
2aeb0 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
2aec0 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  ce);.  for(ii=0,
2aed0 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3c 6d   pFrom=aTo; ii<m
2aee0 78 43 68 6f 69 63 65 2a 32 3b 20 69 69 2b 2b 2c  xChoice*2; ii++,
2aef0 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
2af00 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
2af10 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
2af20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
2af30 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
2af40 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
2af50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
2af60 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
2af70 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
2af80 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 6e 46   (double)1;.  nF
2af90 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50  rom = 1;..  /* P
2afa0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  recompute the co
2afb0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
2afc0 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73  e final result s
2afd0 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65  et, if the calle
2afe0 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  r.  ** to sqlite
2aff0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61  3WhereBegin() wa
2b000 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  s concerned abou
2b010 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72  t sorting */.  r
2b020 53 6f 72 74 43 6f 73 74 20 3d 20 28 64 6f 75 62  SortCost = (doub
2b030 6c 65 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e  le)0;.  if( pWIn
2b040 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
2b050 7c 7c 20 6e 52 6f 77 45 73 74 3c 3d 30 2e 30 20  || nRowEst<=0.0 
2b060 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  ){.    aFrom[0].
2b070 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2b080 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2b090 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 65   /* Compute an e
2b0a0 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 63  stimate on the c
2b0b0 6f 73 74 20 74 6f 20 73 6f 72 74 20 74 68 65 20  ost to sort the 
2b0c0 65 6e 74 69 72 65 20 72 65 73 75 6c 74 20 73 65  entire result se
2b0d0 74 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f  t */.    rSortCo
2b0e0 73 74 20 3d 20 6e 52 6f 77 45 73 74 2a 65 73 74  st = nRowEst*est
2b0f0 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 23 69  Log(nRowEst);.#i
2b100 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2b110 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
2b120 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2b130 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  e>=2 ){.      sq
2b140 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2b150 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
2b160 3d 25 2d 37 2e 32 67 5c 6e 22 2c 20 72 53 6f 72  =%-7.2g\n", rSor
2b170 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65  tCost);.    }.#e
2b180 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ndif.  }..  /* C
2b190 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
2b1a0 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
2b1b0 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
2b1c0 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
2b1d0 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
2b1e0 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
2b1f0 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
2b200 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
2b210 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
2b220 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
2b230 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
2b240 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
2b250 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
2b260 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
2b270 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
2b280 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
2b290 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
2b2a0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2b2b0 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
2b2c0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
2b2d0 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
2b2e0 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
2b2f0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2b300 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20  maskNew;.       
2b310 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
2b320 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
2b330 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2b340 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
2b350 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20  edValid;.       
2b360 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   u8 isOrdered = 
2b370 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
2b380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2b390 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
2b3a0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
2b3b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
2b3d0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
2b3e0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
2b3f0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b400 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
2b410 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
2b420 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
2b430 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
2b440 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
2b450 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
2b460 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43  st */.        rC
2b470 6f 73 74 20 3d 20 70 57 4c 6f 6f 70 2d 3e 72 53  ost = pWLoop->rS
2b480 65 74 75 70 20 2b 20 70 57 4c 6f 6f 70 2d 3e 72  etup + pWLoop->r
2b490 52 75 6e 2a 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  Run*pFrom->nRow 
2b4a0 2b 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3b 0a  + pFrom->rCost;.
2b4b0 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
2b4c0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
2b4d0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
2b4e0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
2b4f0 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69  ( !isOrderedVali
2b500 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
2b510 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68  witch( wherePath
2b520 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2b530 28 70 57 49 6e 66 6f 2c 20 70 46 72 6f 6d 2c 20  (pWInfo, pFrom, 
2b540 69 4c 6f 6f 70 2c 20 69 4c 6f 6f 70 3d 3d 6e 4c  iLoop, iLoop==nL
2b550 6f 6f 70 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  oop-1,.         
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d     pWLoop, &revM
2b590 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ask) ){.        
2b5a0 20 20 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20      case 1:  /* 
2b5b0 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f  Yes.  pFrom+pWLo
2b5c0 6f 70 20 64 6f 65 73 20 73 61 74 69 73 66 79 20  op does satisfy 
2b5d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b5e0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  use */.         
2b5f0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
2b600 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2b610 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2b620 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b640 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2b650 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57  /* No.  pFrom+pW
2b660 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72  Loop will requir
2b670 65 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  e a separate sor
2b680 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
2b690 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30     isOrdered = 0
2b6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b6b0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2b6c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2b6d0 20 20 72 43 6f 73 74 20 2b 3d 20 72 53 6f 72 74    rCost += rSort
2b6e0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2b6f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b700 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2b710 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79  /* Cannot tell y
2b720 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f  et.  Try again o
2b730 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  n the next itera
2b740 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
2b750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b780 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
2b790 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
2b7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2b7b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2b7c0 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62   pWLoop should b
2b7d0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d  e added to the m
2b7e0 78 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20  xChoice best so 
2b7f0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  far */.        f
2b800 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
2b810 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
2b820 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2b830 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
2b840 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20  oop==maskNew && 
2b850 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2b860 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61  lid==isOrderedVa
2b870 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lid ){.         
2b880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b8a0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
2b8b0 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
2b8c0 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
2b8d0 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43  ce && rCost>=mxC
2b8e0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
2b8f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b910 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2b920 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2b930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2b940 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
2b950 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32     %s cost=%-7.2
2b960 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  g order=%c\n",. 
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2b990 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
2b9a0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20  oop), rCost,.   
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2b9c0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2b9d0 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
2b9e0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
2ba00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
2ba10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ba20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ba30 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61   /* Add a new Pa
2ba40 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20  th to the aTo[] 
2ba50 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  set */.         
2ba60 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
2ba70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2ba80 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
2ba90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
2baa0 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
2bab0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
2bac0 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
2bad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bae0 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
2baf0 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
2bb00 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
2bb10 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
2bb20 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
2bb30 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d       for(jj=nTo-
2bb40 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74  1; aTo[jj].rCost
2bb50 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20  <mxCost; jj--){ 
2bb60 61 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a  assert(jj>0); }.
2bb70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bb80 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f        pTo = &aTo
2bb90 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45  [jj];.#ifdef WHE
2bba0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2bbb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2bbc0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
2bbd0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
2bbe0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2bbf0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
2bc00 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64   cost=%-7.2g ord
2bc10 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2bc20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2bc30 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
2bc40 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
2bc50 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
2bc60 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2bc70 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2bc80 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2bc90 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2bca0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2bcb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bcc0 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
2bcd0 74 3c 3d 72 43 6f 73 74 20 29 7b 0a 23 69 66 64  t<=rCost ){.#ifd
2bce0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2bcf0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
2bd00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2bd10 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2bd30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2bd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bd50 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
2bd60 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d  st=%-7.2g order=
2bd70 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
2bd80 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2bd90 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2bda0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2bdb0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2bdc0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2bdd0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2bde0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2bdf0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2be00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2be10 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
2be20 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64   cost=%-7.2g ord
2be30 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2be40 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2be50 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2be60 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2be70 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20  >rCost,.        
2be80 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2be90 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2bea0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2beb0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2bec0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
2bed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2bee0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2bef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bf00 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61        /* A new a
2bf10 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20  nd better score 
2bf20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
2bf30 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c   created equival
2bf40 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64  ent path */.#ifd
2bf50 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2bf60 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
2bf70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2bf80 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2bf90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bfa0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
2bfc0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 37  date %s cost=%-7
2bfd0 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  .2g order=%c",. 
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2bff0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2c000 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2c010 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
2c020 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2c030 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2c040 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2c050 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2c060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2c070 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
2c080 73 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67  s %s cost=%-7.2g
2c090 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2c0b0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
2c0c0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
2c0d0 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  o->rCost,.      
2c0e0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2c0f0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2c100 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2c110 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2c120 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
2c130 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2c140 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
2c150 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
2c160 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
2c170 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
2c180 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
2c190 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
2c1a0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
2c1b0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2c1c0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2c1d0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
2c1e0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
2c1f0 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Row = pFrom->nRo
2c200 77 20 2a 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w * pWLoop->nOut
2c210 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2c220 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
2c230 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2c240 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72  eredValid = isOr
2c250 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20  deredValid;.    
2c260 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2c270 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
2c280 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2c290 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
2c2a0 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
2c2b0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
2c2c0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
2c2d0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
2c2e0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
2c2f0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
2c300 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
2c310 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
2c320 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2c330 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
2c340 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
2c350 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
2c360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2c370 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
2c380 6f 73 74 20 29 20 6d 78 43 6f 73 74 20 3d 20 70  ost ) mxCost = p
2c390 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
2c3a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2c3c0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2c3d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2c3e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2c3f0 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
2c400 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c410 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
2c420 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
2c430 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
2c440 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
2c450 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
2c460 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2c470 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2c480 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 37  tf(" %s cost=%-7
2c490 2e 32 67 20 6e 72 6f 77 3d 25 2d 37 2e 32 67 20  .2g nrow=%-7.2g 
2c4a0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2c4b0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2c4c0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
2c4d0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
2c4e0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
2c4f0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
2c500 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
2c510 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
2c520 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2c530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2c540 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2c550 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  id && pTo->isOrd
2c560 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2c570 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2c580 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
2c590 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
2c5a0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
2c5b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
2c5c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c5d0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
2c5e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c5f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
2c600 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
2c610 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
2c620 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
2c630 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
2c640 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
2c650 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
2c660 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
2c670 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
2c680 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
2c690 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2c6a0 65 33 45 72 72 6f 72 4d 73 67 28 70 57 49 6e 66  e3ErrorMsg(pWInf
2c6b0 6f 2d 3e 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  o->pParse, "no q
2c6c0 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
2c6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2c6e0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
2c6f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c700 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
2c710 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
2c720 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
2c730 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
2c740 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
2c750 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
2c760 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
2c770 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
2c780 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
2c790 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
2c7a0 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
2c7b0 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
2c7c0 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
2c7d0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2c7e0 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
2c7f0 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
2c800 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
2c810 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
2c820 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
2c830 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2c840 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
2c850 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
2c860 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
2c870 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
2c880 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
2c890 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
2c8a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
2c8b0 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
2c8c0 3b 20 2f 2a 20 46 49 58 4d 45 3a 20 4f 6d 69 74  ; /* FIXME: Omit
2c8d0 20 74 68 65 20 69 46 72 6f 6d 20 66 69 65 6c 64   the iFrom field
2c8e0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
2c8f0 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
2c900 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2c910 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
2c920 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
2c930 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
2c940 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
2c950 6e 4f 42 53 61 74 20 3d 20 70 57 49 6e 66 6f 2d  nOBSat = pWInfo-
2c960 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
2c970 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65  ;.    pWInfo->re
2c980 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2c990 65 76 4c 6f 6f 70 3b 0a 20 20 7d 0a 20 20 70 57  evLoop;.  }.  pW
2c9a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
2c9b0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
2c9c0 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
2c9d0 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
2c9e0 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
2c9f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2ca00 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
2ca10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ca20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2ca30 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
2ca40 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
2ca50 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
2ca60 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2ca70 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2ca80 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
2ca90 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
2caa0 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
2cab0 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
2cac0 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
2cad0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
2cae0 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
2caf0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
2cb00 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
2cb10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2cb20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
2cb30 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
2cb40 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
2cb50 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
2cb60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2cb70 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
2cb80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2cb90 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
2cba0 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
2cbb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
2cbc0 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
2cbd0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
2cbe0 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
2cbf0 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
2cc00 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
2cc10 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
2cc20 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
2cc30 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
2cc40 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
2cc50 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
2cc60 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2cc70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2cc80 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
2cc90 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
2cca0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2ccb0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2ccc0 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
2ccd0 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
2cce0 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
2ccf0 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
2cd00 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
2cd10 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2cd20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2cd30 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
2cd40 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2cd50 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
2cd60 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
2cd70 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
2cd80 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2cd90 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
2cda0 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
2cdb0 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
2cdc0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
2cdd0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdf0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2ce00 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
2ce10 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2ce20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
2ce30 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2ce40 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
2ce70 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
2ce80 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
2ce90 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
2cea0 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
2ceb0 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
2cec0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
2ced0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
2cee0 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
2cef0 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
2cf00 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
2cf10 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
2cf20 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
2cf30 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
2cf40 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2cf50 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
2cf60 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
2cf70 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
2cf80 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
2cf90 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
2cfa0 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
2cfb0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
2cfc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2cfd0 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
2cfe0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2cff0 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
2d000 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
2d010 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
2d020 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
2d030 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
2d040 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
2d050 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
2d060 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
2d070 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
2d080 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
2d090 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
2d0a0 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
2d0b0 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
2d0c0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
2d0d0 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
2d0e0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
2d0f0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
2d100 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
2d110 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
2d120 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
2d130 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
2d140 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
2d150 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
2d160 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
2d170 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
2d180 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
2d190 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
2d1a0 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
2d1b0 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
2d1c0 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
2d1d0 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
2d1e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
2d1f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
2d200 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
2d210 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
2d220 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
2d230 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
2d240 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
2d250 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
2d260 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
2d270 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
2d280 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
2d290 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
2d2a0 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
2d2b0 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
2d2c0 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
2d2d0 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
2d2e0 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
2d2f0 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
2d300 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
2d310 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
2d320 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
2d330 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
2d340 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
2d350 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
2d360 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
2d370 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
2d380 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
2d390 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
2d3a0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2d3b0 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
2d3c0 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
2d3d0 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
2d3e0 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
2d3f0 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
2d400 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
2d410 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
2d420 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
2d430 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2d440 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
2d450 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
2d460 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
2d470 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
2d480 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
2d490 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
2d4a0 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
2d4b0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
2d4c0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
2d4d0 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
2d4e0 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
2d4f0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
2d500 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
2d510 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
2d520 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
2d530 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
2d540 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
2d550 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
2d560 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
2d570 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
2d580 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
2d590 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
2d5a0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
2d5b0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
2d5c0 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
2d5d0 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
2d5e0 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
2d5f0 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
2d600 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
2d610 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
2d620 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
2d630 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
2d640 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
2d650 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
2d660 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
2d670 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
2d680 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
2d690 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
2d6a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2d6b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2d6c0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
2d6d0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
2d6e0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
2d6f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
2d700 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
2d710 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2d720 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
2d730 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
2d740 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
2d750 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
2d760 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
2d770 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
2d780 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
2d790 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
2d7a0 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
2d7b0 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
2d7c0 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
2d7d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2d7e0 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
2d7f0 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
2d800 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
2d810 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 66 69  reInfo.nOBSat fi
2d820 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 70 4f  eld is set to pO
2d830 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 20  rderBy->nExpr.  
2d840 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 20 6f 70  This.** is an op
2d850 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
2d860 70 72 65 76 65 6e 74 73 20 61 6e 20 75 6e 6e 65  prevents an unne
2d870 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
2d880 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
2d890 2a 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70  * if an index ap
2d8a0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
2d8b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d8c0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
2d8d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
2d8e0 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
2d8f0 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
2d900 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
2d910 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
2d920 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
2d930 6e 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53  n WhereInfo.nOBS
2d940 61 74 20 69 73 20 30 2e 0a 2a 2f 0a 57 68 65 72  at is 0..*/.Wher
2d950 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
2d960 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
2d970 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d980 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2d990 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
2d9a0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2d9b0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
2d9c0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
2d9d0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
2d9e0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
2d9f0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2da00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2da10 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2da20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
2da30 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
2da40 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2da50 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20  *pDistinct,  /* 
2da60 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  The select-list 
2da70 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65  for DISTINCT que
2da80 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a  ries - or NULL *
2da90 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2daa0 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
2dab0 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
2dac0 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
2dad0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
2dae0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
2daf0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
2db00 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2db10 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
2db20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
2db30 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
2db40 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2db50 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
2db60 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
2db70 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
2db80 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dba0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2dbb0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
2dbc0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2dbd0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2dbe0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
2dbf0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2dc00 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2dc10 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
2dc20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
2dc30 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2dc40 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
2dc50 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2dc60 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
2dc70 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
2dc80 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
2dc90 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
2dca0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
2dcb0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
2dcc0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
2dcd0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2dce0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2dcf0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2dd00 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2dd10 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2dd20 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2dd30 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2dd40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2dd50 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2dd70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2dd80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2dda0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ddb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2dde0 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
2ddf0 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
2de00 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ion */.  memset(
2de10 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
2de20 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e  (sWLB));.  sWLB.
2de30 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2de40 0a 20 20 73 57 4c 42 2e 64 62 20 3d 20 70 50 61  .  sWLB.db = pPa
2de50 72 73 65 2d 3e 64 62 3b 0a 20 20 73 57 4c 42 2e  rse->db;.  sWLB.
2de60 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
2de70 69 73 74 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  ist;.  sWLB.pOrd
2de80 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
2de90 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
2dea0 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
2deb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2dec0 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
2ded0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
2dee0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
2def0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
2df00 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
2df10 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
2df20 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2df30 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
2df40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2df50 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
2df60 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
2df70 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
2df80 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
2df90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
2dfa0 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
2dfb0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
2dfc0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
2dfd0 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
2dfe0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
2dff0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2e000 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2e010 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
2e020 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
2e030 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
2e040 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
2e050 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
2e060 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
2e070 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
2e080 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
2e090 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
2e0a0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
2e0b0 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
2e0c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e0d0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
2e0e0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
2e0f0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
2e100 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2e110 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
2e120 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
2e130 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2e140 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
2e150 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
2e160 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
2e170 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
2e180 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
2e190 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
2e1a0 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
2e1b0 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
2e1c0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
2e1d0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
2e1e0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
2e1f0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
2e200 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
2e210 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
2e220 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
2e230 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
2e240 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
2e250 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
2e260 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
2e270 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
2e280 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
2e290 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
2e2a0 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57  se->db;.  nByteW
2e2b0 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
2e2c0 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
2e2d0 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
2e2e0 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
2e2f0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
2e300 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2e310 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74  (db, .      nByt
2e320 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20  eWInfo + .      
2e330 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75  sizeof(WhereClau
2e340 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65  se) +.      size
2e350 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29  of(WhereMaskSet)
2e360 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
2e370 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2e380 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e390 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2e3a0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
2e3b0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2e3c0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
2e3d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
2e3e0 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
2e3f0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
2e400 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
2e410 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
2e420 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
2e430 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2e440 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69  y;.  pWInfo->pDi
2e450 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
2e460 63 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  ct;.  pWInfo->iB
2e470 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
2e480 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2e490 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20    pWInfo->pWC = 
2e4a0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26  (WhereClause *)&
2e4b0 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e  ((u8 *)pWInfo)[n
2e4c0 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57  ByteWInfo];.  pW
2e4d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2e4e0 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
2e4f0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2e500 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
2e510 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
2e520 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65   pMaskSet = (Whe
2e530 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 49 6e  reMaskSet*)&pWIn
2e540 66 6f 2d 3e 70 57 43 5b 31 5d 3b 0a 20 20 73 57  fo->pWC[1];.  sW
2e550 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
2e560 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
2e570 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 0a 20   pWInfo->pWC;.. 
2e580 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
2e590 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
2e5a0 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
2e5b0 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
2e5c0 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
2e5d0 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
2e5e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2e5f0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
2e600 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
2e610 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
2e620 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
2e630 63 74 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e  ctOpt) ) pDistin
2e640 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70  ct = 0;..  /* Sp
2e650 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
2e660 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
2e670 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
2e680 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
2e690 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
2e6a0 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
2e6b0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2e6c0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
2e6d0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
2e6e0 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
2e6f0 28 70 57 49 6e 66 6f 2d 3e 70 57 43 2c 20 70 50  (pWInfo->pWC, pP
2e700 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20  arse, pMaskSet, 
2e710 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73  wctrlFlags);.  s
2e720 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2e730 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2e740 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2e750 53 70 6c 69 74 28 70 57 49 6e 66 6f 2d 3e 70 57  Split(pWInfo->pW
2e760 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
2e770 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  D);   /* IMP: R-
2e780 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20  15842-53296 */. 
2e790 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
2e7a0 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
2e7b0 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
2e7c0 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
2e7d0 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
2e7e0 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
2e7f0 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
2e800 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
2e810 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
2e820 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e  if( pWhere && (n
2e830 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
2e840 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2e850 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
2e860 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
2e870 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2e880 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
2e890 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2e8a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2e8b0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
2e8c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
2e8d0 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
2e8e0 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
2e8f0 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
2e900 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
2e910 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
2e920 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
2e930 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
2e940 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
2e950 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
2e960 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
2e970 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2e980 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
2e990 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
2e9a0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
2e9b0 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
2e9c0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
2e9d0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
2e9e0 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
2e9f0 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
2ea00 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2ea10 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
2ea20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
2ea30 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
2ea40 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ea50 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
2ea60 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
2ea70 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
2ea80 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2ea90 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
2eaa0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
2eab0 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
2eac0 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
2ead0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
2eae0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2eaf0 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
2eb00 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
2eb10 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
2eb20 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2eb30 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
2eb40 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2eb50 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
2eb60 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2eb70 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2eb80 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2eb90 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2eba0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
2ebb0 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
2ebc0 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
2ebd0 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
2ebe0 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
2ebf0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
2ec00 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
2ec10 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
2ec20 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
2ec30 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
2ec40 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
2ec50 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
2ec60 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
2ec70 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
2ec80 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
2ec90 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2eca0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
2ecb0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
2ecc0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
2ecd0 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
2ece0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
2ecf0 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
2ed00 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
2ed10 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
2ed20 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2ed30 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
2ed40 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2ed50 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
2ed60 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
2ed70 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
2ed80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2ed90 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
2eda0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2edb0 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
2edc0 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
2edd0 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
2ede0 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
2edf0 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
2ee00 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2ee10 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
2ee20 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
2ee30 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
2ee40 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
2ee50 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
2ee60 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
2ee70 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
2ee80 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
2ee90 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
2eea0 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
2eeb0 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
2eec0 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
2eed0 4c 69 73 74 2c 20 70 57 49 6e 66 6f 2d 3e 70 57  List, pWInfo->pW
2eee0 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
2eef0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2ef00 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2ef10 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
2ef20 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 44  * Check if the D
2ef30 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
2ef40 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  r, if there is o
2ef50 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ne, is redundant
2ef60 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  . .  ** If it is
2ef70 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69 73 74  , then set pDist
2ef80 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64  inct to NULL and
2ef90 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69 73 74   WhereInfo.eDist
2efa0 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45  inct to.  ** WHE
2efb0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2efc0 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 63  UE to tell the c
2efd0 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  aller to ignore 
2efe0 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a 20 20  the DISTINCT..  
2eff0 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74 69 6e  */.  if( pDistin
2f000 63 74 20 26 26 20 69 73 44 69 73 74 69 6e 63 74  ct && isDistinct
2f010 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
2f020 2c 70 54 61 62 4c 69 73 74 2c 70 57 49 6e 66 6f  ,pTabList,pWInfo
2f030 2d 3e 70 57 43 2c 70 44 69 73 74 69 6e 63 74 29  ->pWC,pDistinct)
2f040 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63   ){.    pDistinc
2f050 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66  t = 0;.    pWInf
2f060 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2f070 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f080 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  IQUE;.  }..  /* 
2f090 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
2f0a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2f0b0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
2f0c0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
2f0d0 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
2f0e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2f0f0 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
2f100 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2f110 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2f120 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  .  /* Display al
2f130 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
2f140 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68  op objects if wh
2f150 65 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62  eretrace is enab
2f160 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  led */.#ifdef WH
2f170 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2f180 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2f190 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
2f1a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
2f1b0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
2f1c0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
2f1d0 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
2f1e0 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
2f1f0 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f220 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2f230 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
2f240 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e  ;.    for(p=pWIn
2f250 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 3b 20 70  fo->pLoops; p; p
2f260 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
2f270 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
2f280 4c 61 62 65 6c 5b 28 69 2b 2b 29 25 73 69 7a 65  Label[(i++)%size
2f290 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
2f2a0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2f2b0 74 28 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  t(p, pTabList);.
2f2c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2f2d0 0a 0a 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c  ..  wherePathSol
2f2e0 76 65 72 28 70 57 49 6e 66 6f 2c 20 2d 31 29 3b  ver(pWInfo, -1);
2f2f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2f300 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2f310 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2f320 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2f330 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 77  rderBy ){.     w
2f340 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
2f350 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e  WInfo, pWInfo->n
2f360 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 20 69 66  RowOut);.     if
2f370 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2f380 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2f390 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2f3a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2f3b0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2f3c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2f3d0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2f3e0 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
2f3f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2f400 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2f410 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
2f420 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69  int ii;.    sqli
2f430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f440 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 22 29 3b  ---- Solution");
2f450 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2f460 3e 6e 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20  >nOBSat ){.     
2f470 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f480 6e 74 66 28 22 20 4f 52 44 45 52 20 42 59 20 6f  ntf(" ORDER BY o
2f490 6d 69 74 74 65 64 20 72 65 76 3d 30 78 25 6c 6c  mitted rev=0x%ll
2f4a0 78 5c 6e 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  x\n", pWInfo->re
2f4b0 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  vMask);.    }els
2f4c0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2f4d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
2f4e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
2f4f0 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
2f500 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  st; ii++){.     
2f510 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
2f520 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
2f530 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  Loop, pTabList);
2f540 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2f550 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  f.  WHERETRACE((
2f560 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
2f570 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
2f580 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 46 49 58  ;..#if 0  /* FIX
2f590 4d 45 3a 20 41 64 64 20 74 68 69 73 20 62 61 63  ME: Add this bac
2f5a0 6b 20 69 6e 3f 20 2a 2f 0a 20 20 2f 2a 20 49 66  k in? */.  /* If
2f5b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
2f5c0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2f5d0 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
2f5e0 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
2f5f0 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
2f600 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2f610 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
2f620 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
2f630 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
2f640 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
2f650 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
2f660 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
2f670 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
2f680 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
2f690 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
2f6a0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
2f6b0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
2f6c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2f6d0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
2f6e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
2f6f0 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
2f700 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2f710 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
2f720 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
2f730 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
2f740 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
2f750 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
2f760 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
2f770 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
2f780 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
2f790 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  Y;.  }.#endif.. 
2f7a0 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
2f7b0 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
2f7c0 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
2f7d0 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
2f7e0 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
2f7f0 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2f800 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  */.  sqlite3Code
2f810 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2f820 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
2f830 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
2f840 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
2f850 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2f860 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e  itmask)0;.  pWIn
2f870 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64  fo->nRowOut = (d
2f880 6f 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69  ouble)1;.  for(i
2f890 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2f8a0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
2f8b0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
2f8c0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2f8d0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
2f8e0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2f8f0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
2f900 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
2f910 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2f920 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
2f930 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
2f940 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
2f950 74 65 6d 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  tem;.    WhereLo
2f960 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a 20 20 20 20  op *pLoop;..    
2f970 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2f980 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2f990 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
2f9a0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2f9b0 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
2f9c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2f9d0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
2f9e0 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
2f9f0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2fa00 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
2fa10 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2fa20 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
2fa30 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
2fa40 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
2fa50 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
2fa60 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
2fa70 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2fa80 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
2fa90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2faa0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2fab0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2fac0 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
2fad0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2fae0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
2faf0 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
2fb00 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
2fb10 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2fb20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fb30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
2fb40 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
2fb50 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
2fb60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
2fb70 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2fb80 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
2fb90 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
2fba0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
2fbb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2fbc0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2fbd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
2fbe0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2fbf0 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
2fc00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2fc10 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
2fc20 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
2fc30 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
2fc40 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
2fc50 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
2fc60 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
2fc70 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
2fc80 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74  ab, op);.      t
2fc90 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
2fca0 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
2fcb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2fcc0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b  ab->nCol==BMS );
2fcd0 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
2fce0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
2fcf0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
2fd00 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2fd10 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2fd20 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2fd30 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2fd40 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2fd50 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2fd60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd70 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69  ChangeP4(v, sqli
2fd80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2fd90 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20  dr(v)-1, .      
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
2fdc0 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
2fdd0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
2fde0 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
2fdf0 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
2fe00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fe10 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2fe20 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2fe30 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2fe40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2fe50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2fe60 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2fe70 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
2fe80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2fe90 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2fea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2feb0 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
2fec0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
2fed0 49 6e 66 6f 2d 3e 70 57 43 2c 20 70 54 61 62 49  Info->pWC, pTabI
2fee0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
2fef0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
2ff00 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2ff10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2ff20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
2ff30 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
2ff40 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
2ff50 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2ff60 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2ff70 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
2ff80 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
2ff90 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  Ix);.      /* FI
2ffa0 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69  XME:  As an opti
2ffb0 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61  mization use pTa
2ffc0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69  bItem->iCursor i
2ffd0 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  f WHERE_IDX_ONLY
2ffe0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49   */.      int iI
2fff0 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
30000 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
30010 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20  Cur ? iIdxCur : 
30020 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
30030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
30040 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
30050 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
30060 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
30070 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
30080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30090 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
300a0 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  d, iIndexCur, pI
300b0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
300c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
300e0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
300f0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
30100 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
30110 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
30120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
30130 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
30140 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
30150 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
30160 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 49 6e 66  = ~getMask(pWInf
30170 6f 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  o->pWC->pMaskSet
30180 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
30190 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
301a0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
301b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
301c0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
301d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
301e0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
301f0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
30200 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
30210 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
30220 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
30230 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
30240 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
30250 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
30260 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
30270 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
30280 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
30290 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
302a0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
302b0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
302c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
302d0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
302e0 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
302f0 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
30300 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
30310 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
30320 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
30330 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
30340 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
30350 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 77  rt(pWInfo, ii, w
30360 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65  ctrlFlags, notRe
30370 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
30380 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
30390 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
303a0 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
303b0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  */.  return pWIn
303c0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
303d0 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
303e0 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
303f0 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
30400 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
30410 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
30420 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
30430 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
30440 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
30450 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
30460 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
30470 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
30480 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
30490 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
304a0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
304b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
304c0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
304d0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
304e0 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
304f0 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
30500 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
30510 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
30520 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
30530 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
30540 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
30550 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
30560 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
30570 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
30580 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
30590 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
305a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
305b0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
305c0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
305d0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
305e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
305f0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
30600 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
30610 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
30620 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
30630 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
30640 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
30650 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
30660 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
30670 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30680 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
30690 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
306a0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
306b0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
306c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
306d0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
306e0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
306f0 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  >p2);.      sqli
30700 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
30710 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a  v, pLevel->p5);.
30720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
30730 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
30740 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
30750 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
30760 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
30770 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
30780 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
30790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
307a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
307b0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
307c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
307d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
307e0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
307f0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
30800 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
30810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30820 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
30830 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
30840 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30850 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
30860 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
30870 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
30880 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
30890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
308a0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
308b0 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
308c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
308d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
308e0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
308f0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
30900 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30910 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
30920 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
30930 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
30940 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
30950 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
30960 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
30970 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
30980 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
30990 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
309a0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
309b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
309c0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
309d0 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70         || (pLoop
309e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
309f0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
30a00 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
30a10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
30a20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
30a30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30a40 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30a50 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
30a60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
30a70 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
30a80 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
30a90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
30aa0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20  DEXED ){.       
30ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30ac0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
30ad0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
30ae0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30af0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
30b00 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
30b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30b30 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
30b40 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
30b50 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
30b60 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
30b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30b80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
30b90 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30bb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30bc0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
30bd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
30be0 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
30bf0 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
30c00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30c10 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
30c20 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
30c30 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30c40 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
30c50 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
30c60 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
30c70 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
30c80 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
30c90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30ca0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30cb0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
30cc0 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =1 || pWInfo->nL
30cd0 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  evel==pTabList->
30ce0 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
30cf0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
30d00 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
30d10 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
30d20 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
30d30 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
30d40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30d50 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
30d60 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
30d70 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
30d80 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
30d90 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
30da0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
30db0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
30dc0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
30dd0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
30de0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
30df0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
30e00 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
30e10 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
30e20 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30e30 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
30e40 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
30e50 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
30e60 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
30e70 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  gs;.      if( !p
30e80 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
30e90 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
30ea0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
30eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30ec0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30ed0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
30ee0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
30ef0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73   }.      if( (ws
30f00 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30f10 29 21 3d 30 20 26 26 20 28 77 73 20 26 20 28 57  )!=0 && (ws & (W
30f20 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 54  HERE_IPK|WHERE_T
30f30 45 4d 50 5f 49 4e 44 45 58 29 29 3d 3d 30 20 29  EMP_INDEX))==0 )
30f40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30f60 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
30f70 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
30f80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30f90 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
30fa0 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
30fb0 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  e code substitut
30fc0 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
30fd0 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
30fe0 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65  e index in prefe
30ff0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62  rence to the tab
31000 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74  le. Sometimes, t
31010 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
31020 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20   the table need 
31030 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72  never be read fr
31040 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65  om. This is a pe
31050 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c  rformance boost,
31060 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76  .    ** as the v
31070 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20  dbe level waits 
31080 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20  until the table 
31090 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61  is read before a
310a0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73  ctually.    ** s
310b0 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eeking the table
310c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72   cursor to the r
310d0 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64  ecord correspond
310e0 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
310f0 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  nt.    ** positi
31100 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  on in the index.
31110 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
31120 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
31130 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
31140 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
31150 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
31160 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
31170 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
31180 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
31190 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
311a0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
311b0 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
311c0 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
311d0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
311e0 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
311f0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
31200 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
31210 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
31220 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
31230 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
31240 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
31250 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
31260 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
31270 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
31280 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
31290 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
312a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
312b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
312c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
312d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
312e0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
312f0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
31300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
31310 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  dx && !db->mallo
31320 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
31330 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b   int k, j, last;
31340 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
31350 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d  Op;..      pOp =
31360 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
31370 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
31380 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
31390 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
313a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
313b0 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
313c0 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
313d0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
313e0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
313f0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
31400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31410 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
31420 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
31430 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
31440 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
31450 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
31460 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
31470 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
31480 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
31490 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
314a0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
314b0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
314c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
314d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
314e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
314f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
31510 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
31520 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
31530 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e  ==0 || j<pIdx->n
31540 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
31550 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
31560 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
31570 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
31580 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
31590 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
315a0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
315b0 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
315c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
315d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
315e0 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
315f0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51   */.  pParse->nQ
31600 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
31610 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
31620 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  op;.  whereInfoF
31630 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
31640 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.