/ Hex Artifact Content
Login

Artifact 7c931bf930fcf77d9a446e6d60692ab7a6251d00:


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 0a 20 20 64 62  le size */..  db
24770 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b   = pBuilder->db;
24780 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
24790 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
247a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
247b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
247c0 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72  _NOMEM;..  asser
247d0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
247e0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
247f0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
24800 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
24810 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
24820 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  e->nColumn );.  
24830 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
24840 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
24850 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
24860 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
24870 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
24880 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
24890 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
248a0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
248b0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
248c0 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  | (pSrc->jointyp
248d0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
248e0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
248f0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
24900 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
24910 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
24920 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
24930 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
24940 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
24950 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20  LT|WO_LE;.  }.  
24960 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
24970 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
24980 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
24990 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
249a0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74    if( pNew->u.bt
249b0 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65  ree.nEq < pProbe
249c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
249d0 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
249e0 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75  aiColumn[pNew->u
249f0 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20  .btree.nEq];.   
24a00 20 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62   iRowEst = pProb
24a10 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77  e->aiRowEst[pNew
24a20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d  ->u.btree.nEq+1]
24a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24a40 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 52  Col = -1;.    iR
24a50 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  owEst = 1;.  }. 
24a60 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
24a70 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
24a80 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
24a90 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
24aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24ab0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
24ac0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
24ad0 65 64 4c 6f 6f 70 20 3d 20 2a 70 4e 65 77 3b 0a  edLoop = *pNew;.
24ae0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
24af0 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 72 4c   (double)0;.  rL
24b00 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
24b10 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
24b20 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  [0]);.  for(; rc
24b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24b40 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
24b50 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
24b60 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20  scan)){.    int 
24b70 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nIn = 1;.    if(
24b80 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
24b90 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
24ba0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
24bb0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
24bc0 67 73 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 77  gs = savedLoop.w
24bd0 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
24be0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
24bf0 73 61 76 65 64 4c 6f 6f 70 2e 75 2e 62 74 72 65  savedLoop.u.btre
24c00 65 2e 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  e.nEq;.    pNew-
24c10 3e 6e 54 65 72 6d 20 3d 20 73 61 76 65 64 4c 6f  >nTerm = savedLo
24c20 6f 70 2e 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66  op.nTerm;.    if
24c30 28 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 3e 3d 70  ( pNew->nTerm>=p
24c40 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20  Builder->mxTerm 
24c50 29 20 62 72 65 61 6b 3b 20 2f 2a 20 52 65 70 65  ) break; /* Repe
24c60 61 74 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 20 69  ated column in i
24c70 6e 64 65 78 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ndex */.    pNew
24c80 2d 3e 61 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 54  ->aTerm[pNew->nT
24c90 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
24ca0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
24cb0 20 3d 20 28 73 61 76 65 64 4c 6f 6f 70 2e 70 72   = (savedLoop.pr
24cc0 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
24cd0 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
24ce0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
24cf0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
24d00 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
24d10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
24d20 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
24d30 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
24d40 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
24d50 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
24d60 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24d70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24d80 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
24d90 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
24da0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41  SELECT ...)":  A
24db0 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54  ssume the SELECT
24dc0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
24dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
24de0 3d 20 32 35 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = 25;.      }els
24df0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
24e00 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
24e10 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
24e20 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
24e30 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
24e40 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
24e50 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
24e60 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
24e70 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20  nExpr;.      }. 
24e80 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
24e90 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
24ea0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f  pNew->nOut = (do
24eb0 75 62 6c 65 29 69 52 6f 77 45 73 74 20 2a 20 6e  uble)iRowEst * n
24ec0 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20 20 20  InMul * nIn;.   
24ed0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
24ee0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
24ef0 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70  O_EQ) ){.      p
24f00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
24f10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
24f20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
24f30 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
24f40 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28    pNew->nOut = (
24f50 64 6f 75 62 6c 65 29 69 52 6f 77 45 73 74 20 2a  double)iRowEst *
24f60 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c   nInMul;.    }el
24f70 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
24f80 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
24f90 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70  NULL) ){.      p
24fa0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
24fb0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
24fc0 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  L;.      pNew->u
24fd0 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
24fe0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
24ff0 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73 74   (double)iRowEst
25000 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   * nInMul;.    }
25010 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
25020 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
25030 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
25040 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
25050 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
25060 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
25070 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e  _LIMIT;.      pN
25080 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
25090 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20 20 20  Loop.nOut/3;.   
250a0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
250b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
250c0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20  O_LT|WO_LE) ){. 
250d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
250e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
250f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
25100 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
25110 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
25120 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20  edLoop.nOut/3;. 
25130 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 72     }.    pNew->r
25140 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 2a 6e  Run = rLogSize*n
25150 49 6e 3b 20 20 2f 2a 20 43 6f 73 74 20 66 6f 72  In;  /* Cost for
25160 20 6e 49 6e 20 62 69 6e 61 72 79 20 73 65 61 72   nIn binary sear
25170 63 68 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ches */.    if( 
25180 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
25190 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
251a0 57 48 45 52 45 5f 49 50 4b 29 20 29 7b 0a 20 20  WHERE_IPK) ){.  
251b0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
251c0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f  = pNew->nOut;  /
251d0 2a 20 55 6e 69 74 20 73 74 65 70 20 63 6f 73 74  * Unit step cost
251e0 20 74 6f 20 72 65 61 63 68 20 65 61 63 68 20 72   to reach each r
251f0 6f 77 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ow */.    }else{
25200 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
25210 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
25220 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
25230 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
25240 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
25250 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
25260 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
25270 72 52 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f  rRun += pNew->nO
25280 75 74 2a 28 31 20 2b 20 72 4c 6f 67 53 69 7a 65  ut*(1 + rLogSize
25290 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
252a0 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
252b0 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54   and rRun for ST
252c0 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73  AT3 range values
252d0 20 2a 2f 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20   */.    /* TBD: 
252e0 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72 20  Adjust nOut for 
252f0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
25300 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63  raints */.    rc
25310 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
25320 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
25330 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
25340 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
25350 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
25360 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
25370 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
25380 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
25390 20 26 26 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   && pProbe->zNam
253a0 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  e!=0.    ){.    
253b0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
253c0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
253d0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
253e0 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29 3b 0a 20 20   nInMul*nIn);.  
253f0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 20    }.  }.  *pNew 
25400 3d 20 73 61 76 65 64 4c 6f 6f 70 3b 0a 20 20 72  = savedLoop;.  r
25410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25420 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
25430 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
25440 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
25450 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
25460 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
25470 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
25480 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
25490 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
254a0 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
254b0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
254c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
254d0 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
254e0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
254f0 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
25500 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
25510 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
25520 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
25530 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
25540 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
25550 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
25560 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
25570 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
25580 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
25590 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
255a0 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 43  t *pOB;.  int iC
255b0 6f 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20  ol;.  int ii;.. 
255c0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
255d0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3d  lder->pOrderBy)=
255e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
255f0 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e   iCol = pIndex->
25600 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 66  aiColumn[0];.  f
25610 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
25620 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
25630 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
25640 20 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70   pOB->a[ii].pExp
25650 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
25660 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
25670 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25680 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
25690 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
256a0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
256b0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 20 72  Column==iCol ) r
256c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72  eturn 1;.      r
256d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
256e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
256f0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
25700 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25710 73 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  s a single table
25720 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72   of the join wer
25730 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
25740 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42  s idenfied by pB
25750 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
25760 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
25770 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
25780 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
25790 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
257a0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
257b0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
257c0 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
257d0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
257e0 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
257f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
25800 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
25810 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
25820 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
25830 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
25840 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
25850 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ble */.){.  Inde
25860 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
25870 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
25880 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
25890 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
258a0 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
258b0 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
258c0 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
258d0 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
258e0 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
258f0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
25900 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
25910 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
25920 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
25930 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
25940 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
25950 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
25960 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
25970 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 74 72 75   index */.  stru
25980 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
25990 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
259a0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
259b0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
259c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
259d0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
259e0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
259f0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
25a00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25a10 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
25a20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
25a30 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
25a40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
25a50 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
25a60 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a80 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
25a90 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 53 69 7a  */.  double rSiz
25aa0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25ab0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
25ac0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
25ad0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 4c 6f 67  */.  double rLog
25ae0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25af0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
25b00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
25b10 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
25b20 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
25b30 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
25b40 20 20 70 53 72 63 20 3d 20 70 42 75 69 6c 64 65    pSrc = pBuilde
25b50 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  r->pTabList->a +
25b60 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61   pNew->iTab;.  a
25b70 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
25b80 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
25b90 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
25ba0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
25bb0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
25bc0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
25bd0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
25be0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
25bf0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
25c00 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
25c10 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
25c20 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
25c30 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
25c40 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
25c50 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
25c60 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
25c70 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
25c80 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
25c90 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
25ca0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
25cb0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
25cc0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
25cd0 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
25ce0 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
25cf0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
25d00 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
25d10 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
25d40 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
25d50 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
25d60 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
25d70 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
25d80 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
25d90 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
25da0 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
25db0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
25dc0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
25dd0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
25de0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
25df0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
25e00 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
25e10 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
25e20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
25e30 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
25e40 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
25e50 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
25e60 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
25e70 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
25e80 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
25e90 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
25ea0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
25eb0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
25ec0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
25ed0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
25ee0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
25ef0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
25f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
25f10 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
25f20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
25f30 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
25f40 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
25f50 20 28 64 6f 75 62 6c 65 29 70 53 72 63 2d 3e 70   (double)pSrc->p
25f60 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
25f70 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
25f80 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  g(rSize);..  /* 
25f90 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
25fa0 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
25fb0 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20 20 26  lder->pBest.   &
25fc0 26 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 50 61  & (pBuilder->pPa
25fd0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
25fe0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
25ff0 78 29 21 3d 30 20 0a 20 20 20 26 26 20 21 70 53  x)!=0 .   && !pS
26000 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
26010 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
26020 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21  tIndexed.   && !
26030 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
26040 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ed.  ){.    /* G
26050 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
26060 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
26070 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
26080 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72   *pWC = pBuilder
26090 2d 3e 70 57 43 3b 0a 20 20 20 20 57 68 65 72 65  ->pWC;.    Where
260a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
260b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
260c0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
260d0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
260e0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
260f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26100 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
26110 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
26120 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
26130 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
26140 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
26150 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
26160 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
26170 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
26180 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
26190 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
261a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
261b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
261c0 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
261d0 3e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  >nTerm = 1;.    
261e0 20 20 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b      pNew->aTerm[
261f0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
26200 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
26210 20 3d 20 32 30 2a 72 4c 6f 67 53 69 7a 65 2a 70   = 20*rLogSize*p
26220 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
26230 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  st;.        pNew
26240 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65  ->nOut = (double
26250 29 31 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  )10;.        pNe
26260 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69  w->rRun = rLogSi
26270 7a 65 20 2b 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ze + pNew->nOut;
26280 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
26290 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54  sFlags = WHERE_T
262a0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  EMP_INDEX;.     
262b0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
262c0 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
262d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
262e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
262f0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
26300 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
26310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
26320 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
26330 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
26340 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
26350 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
26360 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
26370 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
26380 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  +){.    pNew->u.
26390 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
263a0 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d     pNew->nTerm =
263b0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
263c0 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
263d0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28  pNew->rSetup = (
263e0 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20 70 4e  double)0;.    pN
263f0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
26400 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  tra;.    pNew->u
26410 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
26420 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
26430 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
26440 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
26450 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
26460 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
26470 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
26480 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
26490 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
264a0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
264b0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
264c0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
264d0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
264e0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
264f0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
26500 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
26510 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
26520 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
26530 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26540 20 28 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69   (rSize + rLogSi
26550 7a 65 29 2a 28 33 2b 62 29 3b 20 2f 2a 20 34 78  ze)*(3+b); /* 4x
26560 20 70 65 6e 61 6c 74 79 20 66 6f 72 20 61 20 66   penalty for a f
26570 75 6c 6c 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ull-scan */.    
26580 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
26590 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
265a0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
265b0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
265c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
265d0 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d  itmask m = pSrc-
265e0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
265f0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
26600 28 6a 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  (j=pProbe->nColu
26610 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
26620 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
26630 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
26640 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
26650 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
26660 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
26670 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
26680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26690 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77   }.      pNew->w
266a0 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
266b0 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
266c0 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
266d0 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
266e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
266f0 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
26700 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 6d 3d  */.      if( (m=
26710 3d 30 20 7c 7c 20 62 29 20 26 26 20 70 50 72 6f  =0 || b) && pPro
26720 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
26730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
26740 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
26750 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
26760 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26770 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
26780 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
26790 20 28 6d 3d 3d 30 29 20 3f 20 28 72 53 69 7a 65   (m==0) ? (rSize
267a0 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28 31 2b   + rLogSize)*(1+
267b0 62 29 20 3a 20 28 72 53 69 7a 65 2a 72 4c 6f 67  b) : (rSize*rLog
267c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
267d0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
267e0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
267f0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
26800 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
26810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
26820 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
26830 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
26840 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
26850 65 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  e, 1);..    /* I
26860 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
26870 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
26880 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
26890 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
268a0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
268b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
268c0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
268d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
268e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
268f0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
26900 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
26910 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
26920 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
26930 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
26940 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
26950 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
26960 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
26970 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
26980 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
26990 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
269a0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
269b0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
269c0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
269d0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
269e0 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
269f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
26a00 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
26a10 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
26a20 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  e */.){.  Parse 
26a30 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
26a40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
26a50 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
26a60 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
26a70 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
26a80 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
26a90 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
26aa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
26ab0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
26ac0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
26ad0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
26ae0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
26af0 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
26b00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
26b10 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
26b20 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
26b30 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
26b40 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
26b50 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
26b60 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
26b70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
26b80 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
26b90 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
26ba0 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
26bb0 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
26bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26bd0 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
26be0 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
26bf0 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
26c00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
26c10 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
26c20 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
26c30 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
26c40 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c60 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
26c70 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
26c80 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
26c90 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
26ca0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
26cb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50 61 72  LITE_OK;..  pPar
26cc0 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  se = pBuilder->p
26cd0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
26ce0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
26cf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
26d00 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
26d10 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
26d20 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 54   = &pBuilder->pT
26d30 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
26d40 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
26d50 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
26d60 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
26d70 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
26d80 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
26d90 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
26da0 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
26db0 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
26dc0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
26dd0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
26de0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
26df0 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
26e00 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
26e10 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
26e20 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
26e30 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
26e40 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
26e50 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
26e60 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
26e70 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
26e80 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 0a 20  straintUsage;.. 
26e90 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
26ea0 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
26eb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
26ec0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
26ed0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
26ee0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
26ef0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
26f00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
26f10 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
26f20 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
26f30 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
26f40 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
26f50 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
26f60 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
26f70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
26f80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
26f90 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
26fa0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
26fb0 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
26fc0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
26fd0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
26fe0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
26ff0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
27000 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
27010 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
27020 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
27030 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
27040 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
27050 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
27060 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
27070 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27080 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
27090 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
270a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
270b0 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
270c0 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
270d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
270e0 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
270f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27100 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
27110 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
27120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27140 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
27150 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
27160 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
27170 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27180 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
27190 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
271a0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
271b0 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
271c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
271d0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
271e0 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
271f0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
27200 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27210 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
27220 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
27230 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
27240 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27250 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
27260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27270 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
27280 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
27290 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
272a0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
272b0 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
272c0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
272d0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
272e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
272f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27300 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
27310 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
27320 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
27330 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
27340 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
27350 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
27360 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
27370 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
27380 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
27390 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
273a0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
273b0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
273c0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
273d0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
273e0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
273f0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
27400 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
27410 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
27420 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
27430 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70  OINT... */.    p
27440 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
27450 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
27460 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62  BIG_DBL / ((doub
27470 6c 65 29 32 29 3b 0a 20 20 20 20 72 63 20 3d 20  le)2);.    rc = 
27480 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
27490 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
274a0 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
274b0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
274c0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
274d0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
274e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
274f0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27500 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
27510 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
27520 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
27530 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
27540 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27550 3c 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72  <pBuilder->mxTer
27560 6d 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 54  m; i++) pNew->aT
27570 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
27580 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
27590 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
275a0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
275b0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
275c0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
275d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
275e0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
275f0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
27600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
27610 20 69 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72   iTerm>=pBuilder
27620 2d 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b  ->mxTerm ) break
27630 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  ;.        j = pI
27640 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
27650 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
27660 20 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e 66 6f   iTerm>=pIdxInfo
27670 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ->nConstraint.  
27680 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
27690 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
276a0 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
276b0 20 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b   || pNew->aTerm[
276c0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
276d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
276e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
276f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
27700 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27710 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
27720 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
27730 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
27740 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27750 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
27760 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
27770 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
27780 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
27790 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
277a0 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
277b0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
277c0 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 54 65   pNew->aTerm[iTe
277d0 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
277e0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
277f0 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
27800 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
27810 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
27820 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
27830 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
27840 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 3b 0a  itMask |= 1<<i;.
27850 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
27860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27870 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
27880 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
27890 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
278a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
278b0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
278c0 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
278d0 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
278e0 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
278f0 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
27900 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
27910 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
27920 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
27930 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
27940 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
27950 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
27960 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
27970 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
27980 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
27990 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
279a0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
279b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
279c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
279d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
279e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
279f0 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
27a00 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
27a10 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
27a20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
27a30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
27a40 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
27a50 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
27a60 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
27a70 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
27a80 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
27a90 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
27aa0 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
27ab0 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
27ac0 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
27ad0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
27ae0 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
27af0 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
27b00 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
27b10 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
27b20 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
27b30 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
27b40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27b50 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  }.    if( i>=pId
27b60 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
27b70 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
27b80 2d 3e 6e 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  ->nTerm = mxTerm
27b90 2b 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  +1;.      pNew->
27ba0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
27bb0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
27bc0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
27bd0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
27be0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
27bf0 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
27c00 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
27c10 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
27c20 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
27c30 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
27c40 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
27c50 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
27c60 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
27c70 75 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  u8)(pIdxInfo->nO
27c80 72 64 65 72 42 79 21 3d 30 29 3b 0a 20 20 20 20  rderBy!=0);.    
27c90 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
27ca0 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20   (double)0;.    
27cb0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 70    pNew->rRun = p
27cc0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
27cd0 65 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70 4e  edCost;.      pN
27ce0 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62  ew->nOut = (doub
27cf0 6c 65 29 32 35 3b 0a 20 20 20 20 20 20 77 68 65  le)25;.      whe
27d00 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
27d10 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
27d20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
27d30 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
27d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27d50 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
27d60 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
27d70 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
27d80 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
27d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27da0 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
27db0 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
27dc0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
27dd0 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
27de0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
27df0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
27e00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27e10 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
27e20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27e30 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
27e40 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
27e50 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
27e60 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
27e70 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
27e80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
27e90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27ea0 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
27eb0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
27ec0 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
27ed0 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
27ee0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
27ef0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
27f00 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
27f10 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
27f20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27f30 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
27f40 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
27f50 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
27f60 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
27f70 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ild;.  WhereLoop
27f80 20 73 42 65 73 74 3b 0a 20 20 73 74 72 75 63 74   sBest;.  struct
27f90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27fa0 49 74 65 6d 3b 0a 20 20 0a 0a 20 20 70 57 43 20  Item;.  ..  pWC 
27fb0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
27fc0 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72  .  if( pWC->wctr
27fd0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  lFlags & WHERE_A
27fe0 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e  ND_ONLY ) return
27ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57   SQLITE_OK;.  pW
28000 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
28010 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
28020 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
28030 4e 65 77 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  New;.  pItem = p
28040 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73  Builder->pTabLis
28050 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
28060 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
28070 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 73 53  m->iCursor;.  sS
28080 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
28090 64 65 72 3b 0a 20 20 73 53 75 62 42 75 69 6c 64  der;.  sSubBuild
280a0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
280b0 20 73 53 75 62 42 75 69 6c 64 2e 70 42 65 73 74   sSubBuild.pBest
280c0 20 3d 20 26 73 42 65 73 74 3b 0a 20 20 74 65 6d   = &sBest;.  tem
280d0 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43  pWC.pParse = pWC
280e0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 74 65 6d 70  ->pParse;.  temp
280f0 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
28100 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 74  C->pMaskSet;.  t
28110 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
28120 57 43 3b 0a 20 20 74 65 6d 70 57 43 2e 6f 70 20  WC;.  tempWC.op 
28130 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 74 65 6d 70  = TK_AND;.  temp
28140 57 43 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  WC.wctrlFlags = 
28150 30 3b 0a 20 20 74 65 6d 70 57 43 2e 6e 54 65 72  0;.  tempWC.nTer
28160 6d 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 70 54  m = 1;..  for(pT
28170 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
28180 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
28190 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
281a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
281b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
281c0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
281d0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
281e0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
281f0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
28200 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
28210 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
28220 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
28230 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
28240 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
28250 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
28260 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
28270 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
28280 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
28290 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
282a0 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20    double rTotal 
282b0 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  = 0;.      doubl
282c0 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  e nRow = 0;.    
282d0 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
282e0 20 3d 20 6d 45 78 74 72 61 3b 0a 0a 0a 20 20 20   = mExtra;...   
282f0 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
28300 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
28310 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
28320 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
28330 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
28340 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
28350 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28360 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
28370 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
28380 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
28390 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
283a0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
283b0 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
283c0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
283d0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
283e0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
283f0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
28400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28410 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
28430 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d 20  Best.maskSelf = 
28440 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  0;.        if( I
28450 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
28460 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
28470 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28480 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
28490 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
284a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
284b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
284c0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
284d0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
284e0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
284f0 20 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73          if( sBes
28500 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20  t.maskSelf==0 ) 
28510 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
28520 73 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65  ssert( sBest.rSe
28530 74 75 70 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29  tup==(double)0 )
28540 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
28550 20 2b 3d 20 73 42 65 73 74 2e 72 52 75 6e 3b 0a   += sBest.rRun;.
28560 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
28570 73 42 65 73 74 2e 6e 4f 75 74 3b 0a 20 20 20 20  sBest.nOut;.    
28580 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42      prereq |= sB
28590 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  est.prereq;.    
285a0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
285b0 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
285c0 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20   pNew->aTerm[0] 
285d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
285e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
285f0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
28600 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
28610 70 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  p = (double)0;. 
28620 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
28630 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
28640 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
28650 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
28660 72 65 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a  rereq = prereq;.
28670 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
28680 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
28690 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
286a0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
286b0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
286c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20   pNew);.    }.  
286d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
286e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
286f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
28700 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
28710 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
28720 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
28730 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
28740 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 42   *pBuilder){.  B
28750 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
28760 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
28770 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
28780 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
28790 70 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c  pTabList = pBuil
287a0 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  der->pTabList;. 
287b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
287c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
287d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
287e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
287f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
28800 20 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20   pBuilder->db;. 
28810 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
28820 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
28830 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
28840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28850 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
28860 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
28870 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
28880 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
28890 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
288a0 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  .  pBuilder->pNe
288b0 77 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  w = pNew = sqlit
288c0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
288d0 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
288e0 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  oop));.  if( pNe
288f0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
28900 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 42  LITE_NOMEM;.  pB
28910 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20 3d  uilder->mxTerm =
28920 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 31 3b 0a 20   pWC->nTerm+1;. 
28930 20 77 68 69 6c 65 28 20 70 57 43 2d 3e 70 4f 75   while( pWC->pOu
28940 74 65 72 20 29 7b 0a 20 20 20 20 70 57 43 20 3d  ter ){.    pWC =
28950 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20   pWC->pOuter;.  
28960 20 20 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65    pBuilder->mxTe
28970 72 6d 20 2b 3d 20 70 57 43 2d 3e 6e 54 65 72 6d  rm += pWC->nTerm
28980 3b 0a 20 20 7d 0a 20 20 70 57 43 20 3d 20 70 42  ;.  }.  pWC = pB
28990 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
289a0 4e 65 77 2d 3e 61 54 65 72 6d 20 3d 20 73 71 6c  New->aTerm = sql
289b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
289c0 28 64 62 2c 70 42 75 69 6c 64 65 72 2d 3e 6d 78  (db,pBuilder->mx
289d0 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 4e 65 77  Term*sizeof(pNew
289e0 2d 3e 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  ->aTerm[0]));.  
289f0 69 66 28 20 70 4e 65 77 2d 3e 61 54 65 72 6d 3d  if( pNew->aTerm=
28a00 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
28a10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
28a20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
28a30 64 64 41 6c 6c 5f 65 6e 64 3b 0a 20 20 7d 0a 20  ddAll_end;.  }. 
28a40 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
28a50 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
28a60 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
28a70 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
28a80 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
28a90 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
28aa0 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
28ab0 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
28ac0 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
28ad0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  or);.    if( (pI
28ae0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
28af0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
28b00 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
28b10 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
28b20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
28b30 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
28b40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
28b50 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
28b60 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
28b70 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
28b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
28b90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
28ba0 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  ee(pBuilder, mEx
28bb0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
28bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28bd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28be0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
28bf0 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
28c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69  ;.    }.    mPri
28c10 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b  or |= pNew->mask
28c20 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63  Self;.    if( rc
28c30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28c40 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
28c50 7d 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  }.whereLoopAddAl
28c60 6c 5f 65 6e 64 3a 0a 20 20 77 68 65 72 65 4c 6f  l_end:.  whereLo
28c70 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 42 75  opDelete(db, pBu
28c80 69 6c 64 65 72 2d 3e 70 4e 65 77 29 3b 0a 20 20  ilder->pNew);.  
28c90 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d  pBuilder->pNew =
28ca0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
28cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
28cc0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
28cd0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
28ce0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
28cf0 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 34  ereLoop of the 4
28d00 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
28d10 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
28d20 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
28d30 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
28d40 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
28d50 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
28d60 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
28d70 61 74 65 20 73 6f 75 72 63 65 20 6f 70 65 72 61  ate source opera
28d80 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
28d90 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
28da0 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
28db0 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
28dc0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
28dd0 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
28de0 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
28df0 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
28e00 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
28e10 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
28e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
28e30 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
28e40 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
28e50 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
28e60 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
28e70 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  use */.  WherePa
28e80 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
28e90 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
28ea0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
28eb0 74 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  t nLoop,        
28ec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28ed0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
28ee0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
28ef0 69 6e 74 20 69 73 4c 61 73 74 4c 6f 6f 70 2c 20  int isLastLoop, 
28f00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28f10 72 20 74 68 65 20 76 65 72 79 20 6c 61 73 74 20  r the very last 
28f20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c  loop */.  WhereL
28f30 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
28f40 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
28f50 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
28f60 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
28f70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
28f80 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
28f90 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
28fa0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
28fb0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
28fc0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
28fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28fe0 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
28ff0 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29010 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
29020 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
29030 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
29040 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
29050 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 6e  der */.  u8 isOn
29060 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  eRow;          /
29070 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
29080 6f 6f 70 20 69 73 20 61 20 6f 6e 65 2d 72 6f 77  oop is a one-row
29090 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 72 65   loop */.  u8 re
290a0 71 75 69 72 65 4f 6e 65 52 6f 77 20 3d 20 30 3b  quireOneRow = 0;
290b0 20 2f 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65   /* All subseque
290c0 6e 74 20 6c 6f 6f 70 73 20 6d 75 73 74 20 62 65  nt loops must be
290d0 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 20 20 75 38   one-row */.  u8
290e0 20 69 73 55 6e 69 71 75 65 49 64 78 3b 20 20 20   isUniqueIdx;   
290f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 57      /* Current W
29100 68 65 72 65 4c 6f 6f 70 20 75 73 65 73 20 61 20  hereLoop uses a 
29110 75 6e 69 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a  unique index */.
29120 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 0a 20    u16 nColumn;. 
29130 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 0a 20   u16 nOrderBy;. 
29140 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
29150 20 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e   nUsed = 0;.  in
29160 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 43  t iCur;.  int iC
29170 6f 6c 75 6d 6e 3b 0a 20 20 57 68 65 72 65 4c 6f  olumn;.  WhereLo
29180 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 45 78 70  op *pLoop;.  Exp
29190 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
291a0 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
291b0 42 79 3b 0a 20 20 45 78 70 72 20 2a 70 4f 42 45  By;.  Expr *pOBE
291c0 78 70 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  xpr;.  CollSeq *
291d0 70 43 6f 6c 6c 3b 0a 20 20 49 6e 64 65 78 20 2a  pColl;.  Index *
291e0 70 49 6e 64 65 78 3b 0a 20 20 73 71 6c 69 74 65  pIndex;.  sqlite
291f0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
29200 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 42 69  pParse->db;.  Bi
29210 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
29220 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  0;..  /*.  ** We
29230 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
29240 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
29250 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
29260 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
29270 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
29280 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
29290 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
292a0 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
292b0 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
292c0 20 75 6e 69 71 75 65 0a 20 20 2a 2a 0a 20 20 2a   unique.  **.  *
292d0 2a 20 47 65 6e 65 72 61 6c 20 72 75 6c 65 73 3a  * General rules:
292e0 20 20 28 6e 6f 74 20 61 6e 20 61 6c 67 6f 72 69    (not an algori
292f0 74 68 6d 21 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  thm!).  **.  ** 
29300 20 28 31 29 20 49 66 20 74 68 65 20 63 75 72 72   (1) If the curr
29310 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ent WhereLoop is
29320 20 6f 6e 65 2d 72 6f 77 2c 20 74 68 65 6e 20 6d   one-row, then m
29330 61 74 63 68 20 6f 76 65 72 20 61 6e 79 20 61 6e  atch over any an
29340 64 20 61 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  d all.  **      
29350 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 66  ORDER BY terms f
29360 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 57  or the current W
29370 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 70 72 6f  hereLoop and pro
29380 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ceed to the next
29390 0a 20 20 2a 2a 20 20 20 20 20 20 57 68 65 72 65  .  **      Where
293a0 4c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Loop..  **.  ** 
293b0 20 28 32 29 20 49 66 20 74 68 65 20 63 75 72 72   (2) If the curr
293c0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ent WhereLoop is
293d0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 2c 20 74 68   not one-row, th
293e0 65 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  en all subsequen
293f0 74 0a 20 20 2a 2a 20 20 20 20 20 20 57 68 65 72  t.  **      Wher
29400 65 4c 6f 6f 70 73 20 6d 75 73 74 20 62 65 20 6f  eLoops must be o
29410 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a  ne-row..  **.  *
29420 2a 20 20 28 33 29 20 4f 70 74 69 6f 6e 61 6c 6c  *  (3) Optionall
29430 79 20 6d 61 74 63 68 20 61 6e 79 20 4f 52 44 45  y match any ORDE
29440 52 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  R BY terms again
29450 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 45 71  st the first nEq
29460 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 20 20   columns.  **   
29470 20 20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e     of the index.
29480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 28 34 29 20  .  **.  **  (4) 
29490 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 70 61  Index columns pa
294a0 73 74 20 6e 45 71 20 6d 75 73 74 20 6d 61 74 63  st nEq must matc
294b0 68 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  h ORDER BY terms
294c0 20 6f 6e 65 2d 66 6f 72 2d 6f 6e 65 2e 0a 20 20   one-for-one..  
294d0 2a 2a 0a 20 20 2a 2a 20 20 28 35 29 20 49 66 20  **.  **  (5) If 
294e0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  all columns of a
294f0 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 68 61   UNIQUE index ha
29500 76 65 20 62 65 65 6e 20 6d 61 74 63 68 65 64 20  ve been matched 
29510 61 67 61 69 6e 73 74 20 4f 52 44 45 52 20 42 59  against ORDER BY
29520 0a 20 20 2a 2a 20 20 20 20 20 20 74 65 72 6d 73  .  **      terms
29530 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 73 65  , then any subse
29540 71 75 65 6e 74 20 65 6e 74 72 69 65 73 20 69 6e  quent entries in
29550 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
29560 61 75 73 65 20 61 67 61 69 6e 73 74 20 74 68 65  ause against the
29570 0a 20 20 2a 2a 20 20 20 20 20 20 73 61 6d 65 20  .  **      same 
29580 74 61 62 6c 65 20 63 61 6e 20 62 65 20 73 6b 69  table can be ski
29590 70 70 65 64 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  pped..  */..  as
295a0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
295b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61  0 );..  /* Sorta
295c0 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61  bility of virtua
295d0 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65  l tables is dete
295e0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42  rmined by the xB
295f0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a  estIndex method.
29600 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74    ** of the virt
29610 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66  ual table itself
29620 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d   */.  if( pLast-
29630 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
29640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
29650 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  .    assert( nLo
29660 6f 70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  op==0 );.    ret
29670 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
29680 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
29690 0a 0a 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 69  ..  /* Sorting i
296a0 73 20 61 6c 77 61 79 73 20 72 65 71 75 69 72 65  s always require
296b0 64 20 69 66 20 61 6e 79 20 74 65 72 6d 20 6f 66  d if any term of
296c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 69 73   the ORDER BY is
296d0 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 63 6f 6c   not a .  ** col
296e0 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  umn reference */
296f0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
29700 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 23  rderBy->nExpr;.#
29710 69 66 20 30 0a 20 20 66 6f 72 28 69 3d 30 3b 20  if 0.  for(i=0; 
29720 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
29730 7b 0a 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20  {.    pOBExpr = 
29740 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
29750 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
29760 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
29770 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
29780 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
29790 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
297a0 64 69 66 0a 20 20 20 20 0a 20 20 66 6f 72 28 69  dif.    .  for(i
297b0 3d 30 3b 20 69 3c 3d 6e 4c 6f 6f 70 20 26 26 20  =0; i<=nLoop && 
297c0 6e 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20  nUsed<nOrderBy; 
297d0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 20  i++){.    pLoop 
297e0 3d 20 69 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  = i<nLoop ? pPat
297f0 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 20 3a 20 70 4c  h->aLoop[i] : pL
29800 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
29810 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
29820 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
29830 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
29840 20 69 73 4f 6e 65 52 6f 77 20 3d 20 69 73 55 6e   isOneRow = isUn
29850 69 71 75 65 49 64 78 20 3d 20 31 3b 0a 20 20 20  iqueIdx = 1;.   
29860 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
29870 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
29880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  ){.      if( (pL
29890 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
298a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21  HERE_COLUMN_IN)!
298b0 3d 30 20 29 20 69 73 4f 6e 65 52 6f 77 20 3d 20  =0 ) isOneRow = 
298c0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  0;.      if( pLo
298d0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 21  op->u.btree.nEq!
298e0 3d 31 20 29 20 69 73 4f 6e 65 52 6f 77 20 3d 20  =1 ) isOneRow = 
298f0 30 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 20  0;.      pIndex 
29900 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 75  = 0;.      nColu
29910 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mn = 0;.    }els
29920 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
29930 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
29940 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
29950 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
29960 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29970 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
29980 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
29990 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
299a0 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
299b0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
299c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 4f  e ){.        isO
299d0 6e 65 52 6f 77 20 3d 20 69 73 55 6e 69 71 75 65  neRow = isUnique
299e0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Idx = 0;.      }
299f0 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
29a00 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
29a10 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
29a20 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20  E_COLUMN_RANGE. 
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 20 20 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f    |WHERE_COLUMN_
29a60 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
29a70 20 20 20 20 20 69 73 4f 6e 65 52 6f 77 20 3d 20       isOneRow = 
29a80 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
29a90 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  f( pLoop->u.btre
29aa0 65 2e 6e 45 71 20 3c 20 70 49 6e 64 65 78 2d 3e  e.nEq < pIndex->
29ab0 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
29ac0 20 20 20 69 73 4f 6e 65 52 6f 77 20 3d 20 30 3b     isOneRow = 0;
29ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29ae0 20 20 20 69 66 28 20 21 69 73 4f 6e 65 52 6f 77     if( !isOneRow
29af0 20 26 26 20 72 65 71 75 69 72 65 4f 6e 65 52 6f   && requireOneRo
29b00 77 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  w ) return 0;.  
29b10 20 20 72 65 71 75 69 72 65 4f 6e 65 52 6f 77 20    requireOneRow 
29b20 3d 20 21 69 73 4f 6e 65 52 6f 77 3b 0a 20 20 20  = !isOneRow;.   
29b30 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
29b40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
29b50 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
29b60 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
29b70 20 72 65 76 53 65 74 20 3d 20 72 65 76 20 3d 20   revSet = rev = 
29b80 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
29b90 6a 3c 3d 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e 55  j<=nColumn && nU
29ba0 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  sed<nOrderBy; j+
29bb0 2b 2c 20 6e 55 73 65 64 2b 2b 29 7b 0a 20 20 20  +, nUsed++){.   
29bc0 20 20 20 69 6e 74 20 73 6b 69 70 61 62 6c 65 3b     int skipable;
29bd0 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
29be0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
29bf0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
29c00 2d 3e 61 5b 6e 55 73 65 64 5d 2e 70 45 78 70 72  ->a[nUsed].pExpr
29c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
29c20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
29c30 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
29c40 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
29c50 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
29c60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
29c70 66 28 20 69 73 4f 6e 65 52 6f 77 20 29 7b 20 6a  f( isOneRow ){ j
29c80 2d 2d 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a  --; continue; }.
29c90 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c        if( j<nCol
29ca0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  umn ){.        /
29cb0 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63  * Normal index c
29cc0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
29cd0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
29ce0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
29cf0 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20  .        revIdx 
29d00 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
29d10 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
29d20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
29d30 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
29d40 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
29d50 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
29d60 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
29d70 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20  ROWID column at 
29d80 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  the end */.     
29d90 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
29da0 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20  .        revIdx 
29db0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
29dc0 20 20 20 73 6b 69 70 61 62 6c 65 20 3d 20 6a 3c     skipable = j<
29dd0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
29de0 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 54 65  Eq && pLoop->aTe
29df0 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
29e00 21 3d 57 4f 5f 49 4e 3b 0a 20 20 20 20 20 20 69  !=WO_IN;.      i
29e10 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  f( pOBExpr->iCol
29e20 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
29e30 20 20 20 20 20 20 20 20 69 66 28 20 73 6b 69 70          if( skip
29e40 61 62 6c 65 20 29 7b 20 6e 55 73 65 64 2d 2d 3b  able ){ nUsed--;
29e50 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
29e60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29e80 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
29e90 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
29ea0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
29eb0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
29ec0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 55  , pOrderBy->a[nU
29ed0 73 65 64 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  sed].pExpr);.   
29ee0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
29ef0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
29f00 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
29f10 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
29f20 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
29f30 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
29f40 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [j])!=0 ){.     
29f50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29f70 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
29f80 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
29f90 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
29fa0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
29fb0 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
29fc0 65 72 42 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e 73  erBy->a[nUsed].s
29fd0 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
29fe0 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n 0;.        }el
29ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2a000 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2a010 64 65 72 42 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e  derBy->a[nUsed].
2a020 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
2a030 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
2a040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a050 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
2a060 6e 43 6f 6c 75 6d 6e 2d 31 20 26 26 20 69 73 55  nColumn-1 && isU
2a070 6e 69 71 75 65 49 64 78 20 29 7b 0a 20 20 20 20  niqueIdx ){.    
2a080 20 20 20 20 69 66 28 20 69 73 4c 61 73 74 4c 6f      if( isLastLo
2a090 6f 70 20 26 26 20 69 3d 3d 6e 4c 6f 6f 70 20 29  op && i==nLoop )
2a0a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a0b0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  j--;.        isO
2a0c0 6e 65 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20  neRow = 1;.     
2a0d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2a0e0 20 72 65 76 20 29 20 72 65 76 4d 61 73 6b 20 7c   rev ) revMask |
2a0f0 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
2a100 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c  i;.  }.  if( isL
2a110 61 73 74 4c 6f 6f 70 20 7c 7c 20 6e 55 73 65 64  astLoop || nUsed
2a120 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
2a130 20 20 2a 70 52 65 76 4d 61 73 6b 20 3d 20 72 65    *pRevMask = re
2a140 76 4d 61 73 6b 3b 0a 20 20 20 20 72 65 74 75 72  vMask;.    retur
2a150 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2a160 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n -1;.}..#ifdef 
2a170 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2a180 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
2a190 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
2a1a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2a1b0 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
2a1c0 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
2a1d0 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
2a1e0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
2a1f0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
2a200 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
2a210 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2a220 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
2a230 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
2a240 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
2a250 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
2a260 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
2a270 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
2a280 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
2a290 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
2a2a0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
2a2b0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
2a2c0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e 20  Loop objects on 
2a2d0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2a2e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a2f0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
2a300 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
2a310 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
2a320 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
2a330 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
2a340 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
2a350 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
2a360 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
2a370 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  fields..**.** Re
2a380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2a390 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
2a3a0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
2a3b0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2a3c0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
2a3d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a3e0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
2a3f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2a400 6f 2c 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73  o, double nRowEs
2a410 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  t){.  const int 
2a420 6d 78 43 68 6f 69 63 65 20 3d 20 31 30 3b 20 20  mxChoice = 10;  
2a430 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2a440 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
2a450 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
2a460 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
2a490 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
2a4a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4c0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2a4d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
2a4e0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2a4f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2a500 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
2a510 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
2a520 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
2a530 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2a540 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2a550 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43  s */.  double rC
2a560 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
2a570 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
2a580 74 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6d  th */.  double m
2a590 78 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  xCost;          
2a5a0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
2a5b0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
2a5c0 74 68 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ths */.  double 
2a5d0 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20  rSortCost;      
2a5e0 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f     /* Cost to do
2a5f0 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74   a sort */.  int
2a600 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
2a610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a620 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
2a630 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
2a640 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
2a650 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
2a660 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
2a670 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
2a680 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
2a690 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2a6a0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2a6b0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
2a6c0 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
2a6d0 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
2a6e0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
2a6f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2a700 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
2a710 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2a720 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2a730 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
2a740 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
2a750 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
2a760 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2a770 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
2a780 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
2a790 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2a7a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2a7b0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
2a7c0 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
2a7d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
2a7e0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
2a7f0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
2a800 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
2a810 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
2a820 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
2a830 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
2a840 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 57 49 6e 66  */..  db = pWInf
2a850 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
2a860 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
2a870 3e 6e 4c 65 76 65 6c 3b 0a 20 20 61 73 73 65 72  >nLevel;.  asser
2a880 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
2a890 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
2a8a0 20 29 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45   );.#ifdef WHERE
2a8b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2a8c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a8d0 54 72 61 63 65 3e 3d 32 20 29 20 73 71 6c 69 74  Trace>=2 ) sqlit
2a8e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
2a8f0 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
2a900 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  \n");.#endif..  
2a910 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
2a920 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
2a930 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72   for aTo and aFr
2a940 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69  om */.  ii = (si
2a950 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
2a960 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
2a970 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
2a980 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d  ce*2;.  pSpace =
2a990 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2a9a0 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69  Raw(db, ii);.  i
2a9b0 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
2a9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a9d0 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  EM;.  aTo = (Whe
2a9e0 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
2a9f0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
2aa00 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
2aa10 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
2aa20 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
2aa30 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
2aa40 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
2aa50 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  e);.  for(ii=0, 
2aa60 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3c 6d 78  pFrom=aTo; ii<mx
2aa70 43 68 6f 69 63 65 2a 32 3b 20 69 69 2b 2b 2c 20  Choice*2; ii++, 
2aa80 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
2aa90 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
2aaa0 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
2aab0 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  }..  /* Seed the
2aac0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
2aad0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
2aae0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
2aaf0 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
2ab00 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
2ab10 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 6e 46 72  (double)1;.  nFr
2ab20 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
2ab30 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
2ab40 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
2ab50 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
2ab60 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
2ab70 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
2ab80 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
2ab90 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
2aba0 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
2abb0 6f 72 74 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  ortCost = (doubl
2abc0 65 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  e)0;.  if( pWInf
2abd0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
2abe0 7c 20 6e 52 6f 77 45 73 74 3c 3d 30 2e 30 20 29  | nRowEst<=0.0 )
2abf0 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
2ac00 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2ac10 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2ac20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 65 73  /* Compute an es
2ac30 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 63 6f  timate on the co
2ac40 73 74 20 74 6f 20 73 6f 72 74 20 74 68 65 20 65  st to sort the e
2ac50 6e 74 69 72 65 20 72 65 73 75 6c 74 20 73 65 74  ntire result set
2ac60 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
2ac70 74 20 3d 20 6e 52 6f 77 45 73 74 2a 65 73 74 4c  t = nRowEst*estL
2ac80 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 23 69 66  og(nRowEst);.#if
2ac90 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2aca0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
2acb0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2acc0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=2 ){.      sql
2acd0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2ace0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
2acf0 25 2d 37 2e 32 67 5c 6e 22 2c 20 72 53 6f 72 74  %-7.2g\n", rSort
2ad00 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Cost);.    }.#en
2ad10 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  dif.  }..  /* Co
2ad20 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
2ad30 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
2ad40 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
2ad50 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
2ad60 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
2ad70 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
2ad80 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
2ad90 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
2ada0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
2adb0 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
2adc0 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
2add0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
2ade0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
2adf0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
2ae00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
2ae10 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
2ae20 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
2ae30 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
2ae40 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
2ae50 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
2ae60 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
2ae70 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
2ae80 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
2ae90 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
2aea0 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
2aeb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
2aec0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2aed0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
2aee0 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
2aef0 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  u8 isOrdered = p
2af00 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
2af10 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
2af20 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
2af30 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
2af40 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2af50 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
2af60 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
2af70 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
2af80 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2af90 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
2afa0 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
2afb0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
2afc0 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
2afd0 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
2afe0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
2aff0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
2b000 73 74 20 3d 20 70 57 4c 6f 6f 70 2d 3e 72 53 65  st = pWLoop->rSe
2b010 74 75 70 20 2b 20 70 57 4c 6f 6f 70 2d 3e 72 52  tup + pWLoop->rR
2b020 75 6e 2a 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b  un*pFrom->nRow +
2b030 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3b 0a 20   pFrom->rCost;. 
2b040 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
2b050 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
2b060 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
2b070 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
2b080 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
2b090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
2b0a0 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
2b0b0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
2b0c0 70 57 49 6e 66 6f 2c 20 70 46 72 6f 6d 2c 20 69  pWInfo, pFrom, i
2b0d0 4c 6f 6f 70 2c 20 69 4c 6f 6f 70 3d 3d 6e 4c 6f  Loop, iLoop==nLo
2b0e0 6f 70 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  op-1,.          
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61    pWLoop, &revMa
2b120 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sk) ){.         
2b130 20 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59     case 1:  /* Y
2b140 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f  es.  pFrom+pWLoo
2b150 70 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74  p does satisfy t
2b160 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2b170 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
2b180 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
2b190 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2b1a0 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2b1b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2b1c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b1d0 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f        case 0:  /
2b1e0 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c  * No.  pFrom+pWL
2b1f0 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65  oop will require
2b200 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2b210 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2b220 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b    isOrdered = 0;
2b230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b240 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2b250 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2b260 20 72 43 6f 73 74 20 2b 3d 20 72 53 6f 72 74 43   rCost += rSortC
2b270 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
2b280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b290 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f        default: /
2b2a0 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65  * Cannot tell ye
2b2b0 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e  t.  Try again on
2b2c0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
2b2d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
2b2e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b300 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  }.        /* Che
2b310 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
2b320 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
2b330 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f  ded to the mxCho
2b340 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20  ice best so far 
2b350 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
2b360 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
2b370 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
2b380 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b390 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
2b3a0 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d  =maskNew && pTo-
2b3b0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d  >isOrderedValid=
2b3c0 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  =isOrderedValid 
2b3d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2b3e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2b3f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b400 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
2b410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b420 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26   nTo>=mxChoice &
2b430 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20  & rCost>=mxCost 
2b440 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
2b450 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2b460 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2b470 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2b480 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2b490 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2b4a0 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
2b4b0 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72  s cost=%-7.2g or
2b4c0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2b4e0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2b4f0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2b500 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
2b510 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2b520 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2b530 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2b540 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2b550 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2b560 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2b570 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
2b590 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74  Add a new Path t
2b5a0 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20  o the aTo[] set 
2b5b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2b5c0 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
2b5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2b5e0 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
2b5f0 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
2b600 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
2b610 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
2b620 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
2b630 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b640 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
2b650 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
2b660 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
2b670 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
2b680 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2b690 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61   for(jj=nTo-1; a
2b6a0 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43  To[jj].rCost<mxC
2b6b0 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65  ost; jj--){ asse
2b6c0 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20  rt(jj>0); }.    
2b6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b6e0 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
2b6f0 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
2b700 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2b710 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b720 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2b730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b740 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b750 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
2b760 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25  t=%-7.2g order=%
2b770 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
2b780 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2b790 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
2b7a0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
2b7b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b7c0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2b7d0 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2b7e0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2b7f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
2b800 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
2b810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
2b820 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
2b830 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
2b840 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2b850 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
2b860 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2b870 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2b880 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b890 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2b8b0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
2b8c0 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c  -7.2g order=%c",
2b8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b8e0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2b8f0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
2b900 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2b930 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2b940 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2b950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b960 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2b970 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
2b980 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25  t=%-7.2g order=%
2b990 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
2b9a0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2b9b0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
2b9c0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
2b9d0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2b9e0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2b9f0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
2ba00 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
2ba10 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2ba20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
2ba30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2ba40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2ba50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ba60 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62    /* A new and b
2ba70 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20  etter score for 
2ba80 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65  a previously cre
2ba90 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20  ated equivalent 
2baa0 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57  path */.#ifdef W
2bab0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2bac0 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  D.          if( 
2bad0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2bae0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
2baf0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2bb00 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
2bb10 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
2bb20 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20   %s cost=%-7.2g 
2bb30 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2bb40 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2bb50 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
2bb60 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
2bb70 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
2bb80 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2bb90 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
2bba0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2bbb0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2bbc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2bbd0 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
2bbe0 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64   cost=%-7.2g ord
2bbf0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2bc00 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2bc10 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
2bc20 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
2bc30 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
2bc40 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2bc50 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
2bc60 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
2bc70 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2bc80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
2bc90 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
2bca0 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
2bcb0 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
2bcc0 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
2bcd0 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
2bce0 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
2bcf0 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
2bd00 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
2bd10 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2bd20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
2bd30 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
2bd40 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
2bd50 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2a 20  = pFrom->nRow * 
2bd60 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
2bd70 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
2bd80 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
2bd90 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2bda0 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65  Valid = isOrdere
2bdb0 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
2bdc0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
2bdd0 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
2bde0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
2bdf0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
2be00 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
2be10 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
2be20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
2be30 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
2be40 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
2be50 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
2be60 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
2be70 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
2be80 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2be90 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
2bea0 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
2beb0 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2bec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2bed0 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
2bee0 29 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e  ) mxCost = pTo->
2bef0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
2bf00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bf10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
2bf20 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2bf30 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
2bf40 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
2bf50 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
2bf60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2bf70 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64  ---- after round
2bf80 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f   %d ----\n", iLo
2bf90 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  op);.      for(i
2bfa0 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69  i=0, pTo=aTo; ii
2bfb0 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b  <nTo; ii++, pTo+
2bfc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
2bfd0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2bfe0 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20   %s cost=%-7.2g 
2bff0 6e 72 6f 77 3d 25 2d 37 2e 32 67 20 6f 72 64 65  nrow=%-7.2g orde
2c000 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
2c010 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2c020 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2c030 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
2c040 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
2c050 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2c060 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
2c070 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2c080 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2c090 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2c0a0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 26  isOrderedValid &
2c0b0 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
2c0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2c0d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2c0e0 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
2c0f0 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
2c100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c120 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
2c130 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
2c140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2c150 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
2c160 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
2c170 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
2c180 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
2c190 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
2c1a0 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
2c1b0 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
2c1c0 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
2c1d0 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
2c1e0 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
2c1f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2c200 72 6f 72 4d 73 67 28 70 57 49 6e 66 6f 2d 3e 70  rorMsg(pWInfo->p
2c210 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
2c220 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
2c230 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c240 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
2c250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c260 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
2c270 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
2c280 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
2c290 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
2c2a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
2c2b0 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
2c2c0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
2c2d0 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
2c2e0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
2c2f0 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
2c300 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
2c310 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
2c320 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c330 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
2c340 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
2c350 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
2c360 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
2c370 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
2c380 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
2c390 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2c3a0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2c3b0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
2c3c0 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
2c3d0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
2c3e0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
2c3f0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
2c400 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
2c410 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 20 2f 2a  pWLoop->iTab; /*
2c420 20 46 49 58 4d 45 3a 20 4f 6d 69 74 20 74 68 65   FIXME: Omit the
2c430 20 69 46 72 6f 6d 20 66 69 65 6c 64 20 2a 2f 0a   iFrom field */.
2c440 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
2c450 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2c460 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2c470 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
2c480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
2c490 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
2c4a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
2c4b0 61 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  at = pWInfo->pOr
2c4c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2c4d0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
2c4e0 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
2c4f0 6f 70 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  op;.  }.  pWInfo
2c500 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
2c510 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
2c520 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
2c530 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
2c540 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
2c550 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c560 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
2c570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2c580 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2c590 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2c5a0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
2c5b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2c5c0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
2c5d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2c5e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2c5f0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
2c600 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
2c610 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
2c620 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
2c630 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
2c640 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
2c650 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
2c660 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
2c670 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
2c680 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2c690 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2c6a0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
2c6b0 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
2c6c0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2c6d0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
2c6e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2c6f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
2c700 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
2c710 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
2c720 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
2c730 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
2c740 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
2c750 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
2c760 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
2c770 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
2c780 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
2c790 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
2c7a0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
2c7b0 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
2c7c0 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
2c7d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
2c7e0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
2c7f0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
2c800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
2c810 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
2c820 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
2c830 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
2c840 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
2c850 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
2c860 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
2c870 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
2c880 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2c890 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
2c8a0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2c8b0 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
2c8c0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
2c8d0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2c8e0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
2c8f0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
2c900 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
2c910 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
2c920 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2c930 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2c940 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
2c950 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2c960 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c980 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2c990 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
2c9a0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9c0 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
2c9d0 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
2c9e0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
2c9f0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
2ca00 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
2ca10 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2ca20 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
2ca30 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
2ca40 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
2ca50 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
2ca60 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
2ca70 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
2ca80 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
2ca90 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
2caa0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
2cab0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
2cac0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
2cad0 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
2cae0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
2caf0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
2cb00 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2cb10 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
2cb20 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
2cb30 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
2cb40 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
2cb50 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
2cb60 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
2cb70 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
2cb80 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
2cb90 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
2cba0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
2cbb0 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
2cbc0 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
2cbd0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2cbe0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
2cbf0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
2cc00 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
2cc10 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
2cc20 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
2cc30 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
2cc40 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
2cc50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2cc60 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
2cc70 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
2cc80 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
2cc90 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
2cca0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
2ccb0 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
2ccc0 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
2ccd0 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
2cce0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
2ccf0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
2cd00 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
2cd10 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
2cd20 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
2cd30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
2cd40 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
2cd50 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
2cd60 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
2cd70 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
2cd80 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
2cd90 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
2cda0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
2cdb0 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
2cdc0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
2cdd0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
2cde0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
2cdf0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
2ce00 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2ce10 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
2ce20 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
2ce30 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
2ce40 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
2ce50 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
2ce60 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
2ce70 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
2ce80 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
2ce90 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
2cea0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
2ceb0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2cec0 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
2ced0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
2cee0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
2cef0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
2cf00 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2cf10 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
2cf20 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
2cf30 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
2cf40 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
2cf50 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
2cf60 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
2cf70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
2cf80 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
2cf90 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2cfa0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
2cfb0 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
2cfc0 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
2cfd0 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
2cfe0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
2cff0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
2d000 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
2d010 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
2d020 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
2d030 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
2d040 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
2d050 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
2d060 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
2d070 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
2d080 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
2d090 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
2d0a0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
2d0b0 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
2d0c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2d0d0 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
2d0e0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
2d0f0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
2d100 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2d110 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
2d120 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
2d130 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
2d140 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
2d150 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
2d160 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
2d170 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
2d180 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
2d190 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
2d1a0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
2d1b0 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
2d1c0 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
2d1d0 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
2d1e0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
2d1f0 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
2d200 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
2d210 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
2d220 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2d230 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
2d240 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
2d250 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
2d260 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
2d270 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2d280 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2d290 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2d2a0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
2d2b0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
2d2c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
2d2d0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
2d2e0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
2d2f0 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
2d300 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
2d310 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
2d320 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
2d330 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2d340 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
2d350 75 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  used and.** the 
2d360 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
2d370 66 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20  fo.nOBSat field 
2d380 69 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72  is set to pOrder
2d390 42 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73  By->nExpr.  This
2d3a0 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  .** is an optimi
2d3b0 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
2d3c0 65 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73  ents an unnecess
2d3d0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
2d3e0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66  result set.** if
2d3f0 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
2d400 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52  riate for the OR
2d410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
2d420 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
2d430 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
2d440 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
2d450 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
2d460 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
2d470 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
2d480 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68  t order, then Wh
2d490 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69  ereInfo.nOBSat i
2d4a0 73 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  s 0..*/.WhereInf
2d4b0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
2d4c0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
2d4d0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
2d4e0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2d4f0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2d500 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
2d510 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2d520 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
2d530 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
2d540 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
2d550 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2d560 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2d570 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
2d580 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
2d590 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
2d5a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
2d5b0 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20  stinct,  /* The 
2d5c0 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20  select-list for 
2d5d0 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
2d5e0 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20   - or NULL */.  
2d5f0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2d600 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2d610 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
2d620 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
2d630 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
2d640 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
2d650 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
2d660 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
2d670 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
2d680 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
2d690 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
2d6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d6b0 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
2d6c0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
2d6d0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
2d6e0 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
2d6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d700 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
2d710 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
2d720 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2d730 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
2d740 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2d750 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2d760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2d770 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2d780 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
2d790 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
2d7a0 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
2d7b0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
2d7c0 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
2d7d0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
2d7e0 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
2d7f0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
2d800 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
2d810 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
2d820 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
2d830 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2d840 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
2d850 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
2d860 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
2d870 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
2d880 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
2d890 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
2d8a0 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  fo->a[] */.  int
2d8b0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2d8c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2d8d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
2d8e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2d8f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2d900 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2d910 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d930 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d940 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
2d950 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2d960 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  */.  memset(&sWL
2d970 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
2d980 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 50 61 72  B));.  sWLB.pPar
2d990 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2d9a0 57 4c 42 2e 64 62 20 3d 20 70 50 61 72 73 65 2d  WLB.db = pParse-
2d9b0 3e 64 62 3b 0a 20 20 73 57 4c 42 2e 70 54 61 62  >db;.  sWLB.pTab
2d9c0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2d9d0 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
2d9e0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
2d9f0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2da00 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2da10 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2da20 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
2da30 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
2da40 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
2da50 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2da60 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2da70 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
2da80 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
2da90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2daa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2dab0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
2dac0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
2dad0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
2dae0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
2daf0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
2db00 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
2db10 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
2db20 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
2db30 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
2db40 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
2db50 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
2db60 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
2db70 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
2db80 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
2db90 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2dba0 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
2dbb0 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
2dbc0 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
2dbd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2dbe0 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
2dbf0 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
2dc00 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
2dc10 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
2dc20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2dc30 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
2dc40 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
2dc50 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2dc60 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2dc70 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
2dc80 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
2dc90 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
2dca0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
2dcb0 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
2dcc0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
2dcd0 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
2dce0 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
2dcf0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2dd00 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
2dd10 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
2dd20 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
2dd30 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
2dd40 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
2dd50 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
2dd60 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
2dd70 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
2dd80 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
2dd90 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
2dda0 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
2ddb0 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
2ddc0 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
2ddd0 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
2dde0 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
2ddf0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2de00 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f  db;.  nByteWInfo
2de10 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
2de20 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
2de30 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
2de40 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2de50 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2de60 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2de70 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e   .      nByteWIn
2de80 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65  fo + .      size
2de90 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20  of(WhereClause) 
2dea0 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57  +.      sizeof(W
2deb0 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29  hereMaskSet).  )
2dec0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2ded0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2dee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2def0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
2df00 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
2df10 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2df20 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
2df30 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
2df40 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2df50 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2df60 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
2df70 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2df80 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2df90 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
2dfa0 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e   pWInfo->pDistin
2dfb0 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a  ct = pDistinct;.
2dfc0 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
2dfd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2dfe0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
2dff0 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 28 57 68 65  Info->pWC = (Whe
2e000 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38  reClause *)&((u8
2e010 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65   *)pWInfo)[nByte
2e020 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f  WInfo];.  pWInfo
2e030 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
2e040 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
2e050 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2e060 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
2e070 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
2e080 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61  skSet = (WhereMa
2e090 73 6b 53 65 74 2a 29 26 70 57 49 6e 66 6f 2d 3e  skSet*)&pWInfo->
2e0a0 70 57 43 5b 31 5d 3b 0a 20 20 73 57 4c 42 2e 70  pWC[1];.  sWLB.p
2e0b0 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
2e0c0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 70 57 49    sWLB.pWC = pWI
2e0d0 6e 66 6f 2d 3e 70 57 43 3b 0a 0a 20 20 2f 2a 20  nfo->pWC;..  /* 
2e0e0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
2e0f0 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
2e100 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
2e110 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
2e120 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
2e130 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
2e140 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2e150 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
2e160 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
2e170 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2e180 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2e190 74 29 20 29 20 70 44 69 73 74 69 6e 63 74 20 3d  t) ) pDistinct =
2e1a0 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20   0;..  /* Split 
2e1b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e1c0 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
2e1d0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
2e1e0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
2e1f0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
2e200 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
2e210 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
2e220 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
2e230 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
2e240 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57 49  reClauseInit(pWI
2e250 6e 66 6f 2d 3e 70 57 43 2c 20 70 50 61 72 73 65  nfo->pWC, pParse
2e260 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77 63 74 72  , pMaskSet, wctr
2e270 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  lFlags);.  sqlit
2e280 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
2e290 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
2e2a0 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
2e2b0 74 28 70 57 49 6e 66 6f 2d 3e 70 57 43 2c 20 70  t(pWInfo->pWC, p
2e2c0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20  Where, TK_AND); 
2e2d0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34    /* IMP: R-1584
2e2e0 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a  2-53296 */.    .
2e2f0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
2e300 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
2e310 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
2e320 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
2e330 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
2e340 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
2e350 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
2e360 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
2e370 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
2e380 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c  pWhere && (nTabL
2e390 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
2e3a0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
2e3b0 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20  otJoin(pWhere)) 
2e3c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2e3d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2e3e0 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
2e3f0 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  ->iBreak, SQLITE
2e400 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2e410 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
2e420 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
2e430 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
2e440 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
2e450 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
2e460 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2e470 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
2e480 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
2e490 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
2e4a0 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
2e4b0 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
2e4c0 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
2e4d0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
2e4e0 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
2e4f0 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
2e500 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
2e510 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
2e520 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
2e530 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
2e540 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
2e550 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
2e560 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
2e570 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2e580 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
2e590 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
2e5a0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
2e5b0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
2e5c0 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
2e5d0 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
2e5e0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
2e5f0 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
2e600 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2e610 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
2e620 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
2e630 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2e640 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
2e650 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
2e660 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
2e670 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2e680 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2e690 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
2e6a0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2e6b0 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
2e6c0 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
2e6d0 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
2e6e0 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
2e6f0 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
2e700 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
2e710 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
2e720 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
2e730 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
2e740 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
2e750 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
2e760 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
2e770 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
2e780 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
2e790 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2e7a0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
2e7b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
2e7c0 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
2e7d0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
2e7e0 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
2e7f0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2e800 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
2e810 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
2e820 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  .  {.    Bitmask
2e830 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a   toTheLeft = 0;.
2e840 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2e850 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2e860 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69   ii++){.      Bi
2e870 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
2e880 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2e890 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
2e8a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
2e8b0 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
2e8c0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
2e8d0 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
2e8e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2e8f0 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
2e900 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
2e910 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
2e920 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
2e930 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
2e940 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
2e950 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
2e960 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2e970 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
2e980 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
2e990 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
2e9a0 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
2e9b0 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
2e9c0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
2e9d0 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
2e9e0 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
2e9f0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
2ea00 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
2ea10 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
2ea20 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
2ea30 2c 20 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a  , pWInfo->pWC);.
2ea40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2ea50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2ea60 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2ea70 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  or;.  }..  /* Ch
2ea80 65 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49  eck if the DISTI
2ea90 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69  NCT qualifier, i
2eaa0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20  f there is one, 
2eab0 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20  is redundant. . 
2eac0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
2ead0 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74  en set pDistinct
2eae0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65   to NULL and Whe
2eaf0 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74  reInfo.eDistinct
2eb00 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44   to.  ** WHERE_D
2eb10 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74  ISTINCT_UNIQUE t
2eb20 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65  o tell the calle
2eb30 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
2eb40 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20  DISTINCT..  */. 
2eb50 20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26   if( pDistinct &
2eb60 26 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  & isDistinctRedu
2eb70 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 70 54 61  ndant(pParse,pTa
2eb80 62 4c 69 73 74 2c 70 57 49 6e 66 6f 2d 3e 70 57  bList,pWInfo->pW
2eb90 43 2c 70 44 69 73 74 69 6e 63 74 29 20 29 7b 0a  C,pDistinct) ){.
2eba0 20 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d 20      pDistinct = 
2ebb0 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  0;.    pWInfo->e
2ebc0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2ebd0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2ebe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
2ebf0 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c  truct the WhereL
2ec00 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
2ec10 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2ec20 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
2ec30 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 72 63  t ***\n"));.  rc
2ec40 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
2ec50 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 69 66 28  ll(&sWLB);.  if(
2ec60 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
2ec70 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2ec80 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
2ec90 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
2eca0 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
2ecb0 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
2ecc0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
2ecd0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2ece0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ecf0 72 61 63 65 20 29 7b 0a 20 20 20 20 57 68 65 72  race ){.    Wher
2ed00 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 69 6e  eLoop *p;.    in
2ed10 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 73 74 61  t i = 0;.    sta
2ed20 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b  tic char zLabel[
2ed30 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
2ed40 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2ed50 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20  rstuvwyxz".     
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2ed90 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
2eda0 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
2edb0 70 4c 6f 6f 70 73 3b 20 70 3b 20 70 3d 70 2d 3e  pLoops; p; p=p->
2edc0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
2edd0 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
2ede0 6c 5b 28 69 2b 2b 29 25 73 69 7a 65 6f 66 28 7a  l[(i++)%sizeof(z
2edf0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 77  Label)];.      w
2ee00 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
2ee10 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
2ee20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2ee30 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
2ee40 70 57 49 6e 66 6f 2c 20 2d 31 29 3b 0a 20 20 69  pWInfo, -1);.  i
2ee50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ee60 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2ee70 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 69 66  BeginError;.  if
2ee80 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2ee90 42 79 20 29 7b 0a 20 20 20 20 20 77 68 65 72 65  By ){.     where
2eea0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2eeb0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
2eec0 75 74 29 3b 0a 20 20 20 20 20 69 66 28 20 64 62  ut);.     if( db
2eed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2eee0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2eef0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  Error;.  }.  if(
2ef00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2ef10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2ef20 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
2ef30 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2ef40 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
2ef50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2ef60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ef70 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
2ef80 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ii;.    sqlite3D
2ef90 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
2efa0 20 53 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   Solution");.   
2efb0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
2efc0 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Sat ){.      sql
2efd0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2efe0 22 20 4f 52 44 45 52 20 42 59 20 6f 6d 69 74 74  " ORDER BY omitt
2eff0 65 64 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  ed rev=0x%llx\n"
2f000 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
2f010 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
2f020 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2f030 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
2f040 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
2f050 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
2f060 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
2f070 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
2f080 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
2f090 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
2f0a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2f0b0 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2f0c0 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
2f0d0 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 23  hed ***\n"));..#
2f0e0 69 66 20 30 20 20 2f 2a 20 46 49 58 4d 45 3a 20  if 0  /* FIXME: 
2f0f0 41 64 64 20 74 68 69 73 20 62 61 63 6b 20 69 6e  Add this back in
2f100 3f 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 74 68 65  ? */.  /* If the
2f110 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
2f120 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
2f130 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
2f140 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
2f150 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
2f160 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
2f170 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
2f180 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
2f190 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
2f1a0 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
2f1b0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
2f1c0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2f1d0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
2f1e0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
2f1f0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
2f200 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2f210 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2f220 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2f230 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2f240 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2f250 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2f260 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2f270 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26  SS_DESIRED)!=0 &
2f280 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  & (andFlags & WH
2f290 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29  ERE_UNIQUE)!=0 )
2f2a0 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b  {.    pWInfo->ok
2f2b0 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20  OnePass = 1;.   
2f2c0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c   pWInfo->a[0].pl
2f2d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  an.wsFlags &= ~W
2f2e0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
2f2f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2f300 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
2f310 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
2f320 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
2f330 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
2f340 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
2f350 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2f360 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2f370 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2f380 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
2f390 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
2f3a0 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f  ier Goto */.  no
2f3b0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
2f3c0 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  sk)0;.  pWInfo->
2f3d0 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c  nRowOut = (doubl
2f3e0 65 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  e)1;.  for(ii=0,
2f3f0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2f400 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
2f410 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
2f420 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2f430 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
2f440 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
2f450 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
2f460 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
2f470 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2f480 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
2f490 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2f4a0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
2f4b0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
2f4c0 70 4c 6f 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62  pLoop;..    pTab
2f4d0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2f4e0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2f4f0 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
2f500 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2f510 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
2f520 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2f530 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2f540 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2f550 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
2f560 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2f570 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2f580 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
2f590 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2f5a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
2f5b0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
2f5c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f5d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2f5e0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2f5f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2f600 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
2f610 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2f620 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
2f630 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
2f640 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
2f650 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
2f660 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
2f670 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2f680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f690 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
2f6a0 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
2f6b0 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
2f6c0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
2f6d0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
2f6e0 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
2f6f0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2f700 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2f710 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f720 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
2f730 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2f740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
2f750 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
2f760 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2f770 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
2f780 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
2f790 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
2f7a0 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
2f7b0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
2f7c0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2f7d0 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
2f7e0 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
2f7f0 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ase( pTab->nCol=
2f800 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2f810 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e  testcase( pTab->
2f820 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
2f830 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
2f840 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
2f850 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
2f860 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
2f870 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
2f880 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
2f890 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
2f8a0 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
2f8b0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
2f8c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f8d0 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
2f8e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f8f0 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
2f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f910 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
2f920 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
2f930 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f940 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
2f950 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2f960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2f970 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2f980 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2f990 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2f9a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
2f9b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f9c0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2f9d0 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  X.    if( (pLoop
2f9e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f9f0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30  E_TEMP_INDEX)!=0
2fa00 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2fa10 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2fa20 78 28 70 50 61 72 73 65 2c 20 70 57 49 6e 66 6f  x(pParse, pWInfo
2fa30 2d 3e 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  ->pWC, pTabItem,
2fa40 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
2fa50 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  l);.    }else.#e
2fa60 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 6f  ndif.    if( pLo
2fa70 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2fa80 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
2fa90 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
2faa0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2fab0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b  .pIndex;.      K
2fac0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
2fad0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
2fae0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
2faf0 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  .      /* FIXME:
2fb00 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
2fb10 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65  tion use pTabIte
2fb20 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48  m->iCursor if WH
2fb30 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_IDX_ONLY */.
2fb40 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
2fb50 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
2fb60 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  dxCur = iIdxCur 
2fb70 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72  ? iIdxCur : pPar
2fb80 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2fb90 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
2fba0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
2fbb0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
2fbc0 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
2fbd0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
2fbe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2fbf0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2fc00 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
2fc10 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
2fc40 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
2fc50 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
2fc60 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2fc70 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
2fc80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
2fc90 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2fca0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2fcb0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
2fcc0 65 74 4d 61 73 6b 28 70 57 49 6e 66 6f 2d 3e 70  etMask(pWInfo->p
2fcd0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54  WC->pMaskSet, pT
2fce0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
2fcf0 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2fd00 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
2fd10 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2fd20 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2fd30 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2fd40 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2fd50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2fd60 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
2fd70 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
2fd80 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
2fd90 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
2fda0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
2fdb0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
2fdc0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
2fdd0 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
2fde0 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
2fdf0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
2fe00 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
2fe10 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
2fe20 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
2fe30 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
2fe40 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  ;.    explainOne
2fe50 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
2fe60 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
2fe70 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
2fe80 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  , wctrlFlags);. 
2fe90 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f     notReady = co
2fea0 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2feb0 57 49 6e 66 6f 2c 20 69 69 2c 20 77 63 74 72 6c  WInfo, ii, wctrl
2fec0 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
2fed0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2fee0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2fef0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
2ff00 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20  .  /* Done. */. 
2ff10 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
2ff20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
2ff30 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
2ff40 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
2ff50 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
2ff60 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2ff70 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
2ff80 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2ff90 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
2ffa0 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
2ffb0 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
2ffc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
2ffd0 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
2ffe0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
2fff0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
30000 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
30010 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
30020 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
30030 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
30040 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
30050 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
30060 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
30070 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
30080 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
30090 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
300a0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
300b0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
300c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
300d0 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
300e0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
300f0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
30100 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
30110 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
30120 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
30130 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
30140 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
30150 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
30160 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
30170 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
30180 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
30190 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
301a0 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
301b0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
301c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
301d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
301e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
301f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
30200 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
30210 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
30220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
30230 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
30240 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
30250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30260 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
30270 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
30280 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
30290 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
302a0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
302b0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
302c0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
302d0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
302e0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
302f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30300 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
30310 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
30320 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
30330 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
30340 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
30350 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
30360 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
30370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30380 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
30390 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
303a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
303b0 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
303c0 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
303d0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
303e0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
303f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
30400 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
30410 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  InTop-1);.      
30420 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
30430 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
30440 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
30450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30460 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
30470 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
30480 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
30490 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
304a0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
304b0 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
304c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
304d0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
304e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
304f0 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
30500 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
30510 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
30520 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
30530 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73     || (pLoop->ws
30540 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
30550 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
30560 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
30570 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
30580 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
30590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
305a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
305b0 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
305c0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
305d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
305e0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
305f0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
30600 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
30610 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
30620 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
30630 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
30640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30650 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
30660 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
30670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30680 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
30690 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
306a0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
306b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
306c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
306d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
306e0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
306f0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
30700 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30710 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
30720 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
30730 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
30740 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
30750 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
30760 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
30770 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
30780 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
30790 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
307a0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
307b0 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
307c0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
307d0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
307e0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
307f0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
30800 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  */.  assert( pWI
30810 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c  nfo->nLevel==1 |
30820 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
30830 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ==pTabList->nSrc
30840 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
30850 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
30860 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
30870 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
30880 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
30890 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
308a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
308b0 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
308c0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
308d0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
308e0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
308f0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
30900 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
30910 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
30920 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
30930 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
30940 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
30950 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
30960 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
30970 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
30980 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
30990 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
309a0 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
309b0 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
309c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
309d0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
309e0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
309f0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
30a00 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
30a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30a20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
30a30 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
30a40 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
30a50 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
30a60 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
30a70 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
30a80 5f 49 50 4b 7c 57 48 45 52 45 5f 54 45 4d 50 5f  _IPK|WHERE_TEMP_
30a90 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20  INDEX))==0 ){.  
30aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30ab0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
30ac0 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
30ad0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
30ae0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30af0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
30b00 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
30b10 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
30b20 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
30b30 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
30b40 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
30b50 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
30b60 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
30b70 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
30b80 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
30b90 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
30ba0 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
30bb0 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
30bc0 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
30bd0 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
30be0 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
30bf0 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
30c00 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
30c10 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
30c20 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
30c30 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
30c40 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
30c50 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
30c60 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
30c70 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
30c80 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
30c90 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
30ca0 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
30cb0 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
30cc0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
30cd0 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
30ce0 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
30cf0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
30d00 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
30d10 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
30d20 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
30d30 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
30d40 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
30d50 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
30d60 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
30d70 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
30d80 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
30d90 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
30da0 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
30db0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
30dc0 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45  gs & (WHERE_INDE
30dd0 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e  XED|WHERE_IDX_ON
30de0 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  LY) ){.      pId
30df0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
30e00 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  ee.pIndex;.    }
30e10 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
30e20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30e30 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
30e40 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
30e50 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20  >u.pCovidx;.    
30e60 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  }.    if( pIdx &
30e70 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
30e80 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
30e90 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
30ea0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
30eb0 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
30ec0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
30ed0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
30ee0 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
30ef0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
30f00 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
30f10 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
30f20 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
30f30 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
30f40 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
30f50 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
30f60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30f70 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
30f80 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
30f90 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
30fa0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
30fb0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
30fc0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
30fd0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
30fe0 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
30ff0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
31000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
31010 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
31020 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
31030 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31060 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
31070 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
31080 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
31090 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
310a0 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
310b0 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
310c0 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
310d0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
310e0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
310f0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
31100 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
31110 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
31120 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31130 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
31140 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
31150 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
31160 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
31170 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
31180 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
31190 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
311a0 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.