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

Artifact 0c1d6feb0c2ffcc3e37b2d0b5ce044773daa3d44:


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 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11c80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
11c90 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
11ca0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f  el->iIdxCur, nCo
11cb0 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20  lumn+1, 0,.     
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11cd0 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20  char*)pKeyinfo, 
11ce0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
11cf0 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  FF);.  VdbeComme
11d00 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
11d10 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29   pTable->zName))
11d20 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  ;..  /* Fill the
11d30 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11d40 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f   with content */
11d50 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
11d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11d70 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65  , OP_Rewind, pLe
11d80 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
11d90 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
11da0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11db0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
11dc0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
11dd0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
11de0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
11df0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
11e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11e10 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
11e20 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
11e30 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
11e40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
11e50 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
11e60 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
11e70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11e80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
11e90 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
11ea0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
11eb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11ec0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
11ed0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
11ee0 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
11ef0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11f00 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
11f10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11f20 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
11f30 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
11f40 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
11f50 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
11f60 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
11f70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11f80 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
11f90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11fa0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
11fb0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
11fc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11fd0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
11fe0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
11ff0 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
12000 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
12010 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
12020 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
12030 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
12040 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
12050 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
12060 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
12070 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
12080 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
12090 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
120a0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
120b0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
120c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
120d0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
120e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
120f0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12100 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
12110 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
12120 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
12130 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
12140 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
12150 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
12160 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12170 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
12180 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
12190 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
121a0 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
121b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
121c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
121d0 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
121e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
121f0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
12200 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
12210 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
12220 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43  ;..  /*WHERETRAC
12230 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
12240 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
12250 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  s...\n", pSrc->p
12260 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a  Tab->zName));*/.
12270 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
12280 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
12290 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
122a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
122b0 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
122c0 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
122d0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
122e0 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
122f0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
12300 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
12310 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
12320 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
12330 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
12340 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
12350 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
12360 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12370 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
12380 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
12390 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
123a0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
123b0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
123c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
123d0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
123e0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
123f0 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
12400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12410 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
12420 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
12430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12440 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nTerm++;.  }..  
12450 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
12460 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
12470 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
12480 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
12490 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
124a0 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
124b0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
124c0 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
124d0 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
124e0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
124f0 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  cture..  */.  nO
12500 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66  rderBy = 0;.  if
12510 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
12520 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72    int n = pOrder
12530 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  By->nExpr;.    f
12540 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
12550 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
12560 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
12570 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12580 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
12590 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
125a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53  Expr->iTable!=pS
125b0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72  rc->iCursor ) br
125c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
125d0 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20  f( i==n){.      
125e0 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20  nOrderBy = n;.  
125f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
12600 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
12610 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
12620 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70  ructure.  */.  p
12630 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
12640 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
12650 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
12660 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
12690 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
126a0 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
126b0 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
126e0 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
126f0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
12700 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  o==0 ){.    sqli
12710 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12720 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  se, "out of memo
12730 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f  ry");.    /* (do
12740 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f  uble)0 In case o
12750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
12760 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
12770 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
12780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
12790 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
127a0 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
127b0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
127c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
127d0 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
127e0 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
127f0 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
12800 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
12810 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
12820 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
12830 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
12840 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
12850 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
12860 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
12870 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
12880 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
12890 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
128a0 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
128b0 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
128c0 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
128d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
128e0 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
128f0 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
12900 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
12910 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12920 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
12930 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
12940 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
12950 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
12960 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
12970 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
12980 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
12990 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
129a0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
129b0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
129c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
129d0 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
129e0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
129f0 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
12a00 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
12a10 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
12a20 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
12a30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12a40 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
12a50 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
12a60 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 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 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
12ac0 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
12ad0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
12ae0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
12af0 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
12b00 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
12b10 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
12b20 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
12b30 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
12b40 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
12b50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12b60 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
12b70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
12b80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
12b90 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
12ba0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
12bb0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
12bc0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
12bd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
12be0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
12bf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12c00 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
12c10 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
12c20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
12c30 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
12c40 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
12c50 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
12c60 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
12c70 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
12c80 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
12c90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
12ca0 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
12cb0 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
12cc0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
12cd0 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
12ce0 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
12cf0 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
12d00 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
12d10 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
12d20 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
12d30 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
12d40 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12d50 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
12d60 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
12d70 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
12d80 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
12d90 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
12da0 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
12db0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12dc0 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
12dd0 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
12de0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12df0 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
12e00 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
12e10 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12e20 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
12e30 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
12e40 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12e50 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
12e60 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
12e70 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
12e80 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
12e90 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
12ea0 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
12eb0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
12ec0 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
12ed0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12ee0 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
12ef0 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
12f00 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
12f10 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
12f20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
12f30 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
12f40 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
12f50 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12f60 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
12f70 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
12f80 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
12f90 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
12fa0 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
12fb0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
12fc0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
12fd0 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
12fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
12ff0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
13000 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
13010 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13020 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
13030 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
13040 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
13050 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
13060 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
13070 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
13080 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
13090 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
130a0 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
130b0 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65  ndex_info pointe
130c0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
130d0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  he argument..**.
130e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
130f0 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
13100 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13110 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
13120 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
13130 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
13140 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
13150 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
13160 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
13170 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
13180 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13190 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
131a0 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
131b0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
131c0 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
131d0 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
131e0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
131f0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
13200 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
13210 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
13220 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
13230 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
13240 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
13250 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
13260 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
13270 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
13280 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13290 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
132a0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
132b0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
132c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
132d0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
132e0 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
132f0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
13300 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28  .  /*WHERETRACE(
13310 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
13320 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
13330 61 6d 65 29 29 3b 2a 2f 0a 20 20 54 52 41 43 45  ame));*/.  TRACE
13340 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
13350 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
13360 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
13370 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
13380 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
13390 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
133a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
133c0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
133d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
133e0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
133f0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
13400 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
13410 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13420 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
13430 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
13440 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
13450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13460 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13470 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
13480 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
13490 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
134a0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
134b0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
134c0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
134d0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
134e0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
134f0 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
13500 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
13510 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
13520 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
13530 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13540 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13550 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
13560 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
13570 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
13580 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
13590 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
135a0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
135b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
135c0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
135d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
135e0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
135f0 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
13600 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
13610 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13620 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
13630 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
13640 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
13650 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
13660 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
13670 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
13680 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
13690 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
136a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
136b0 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a  less than pVal.*
136c0 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
136d0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
136e0 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
136f0 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pVal.**.** Retur
13700 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
13710 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
13720 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
13730 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
13740 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
13750 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
13760 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
13770 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
13780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13790 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
137a0 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
137b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
137c0 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
137d0 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
137e0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
137f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13800 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
13810 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
13820 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
13830 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
13840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13850 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
13860 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74  n here */.){.  t
13870 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65  Rowcnt n;.  Inde
13880 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
13890 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65  ;.  int i, eType
138a0 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30  ;.  int isEq = 0
138b0 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75  ;.  i64 v;.  dou
138c0 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73  ble r, rS;..  as
138d0 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
138e0 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
138f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
13900 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
13910 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72   if( pVal==0 ) r
13920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13930 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  OR;.  n = pIdx->
13940 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61  aiRowEst[0];.  a
13950 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
13960 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20  Sample;.  eType 
13970 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13980 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
13990 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
139a0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
139b0 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
139c0 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
139d0 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
139e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
139f0 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
13a00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
13a10 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
13a20 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
13a30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
13a40 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13a50 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
13a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
13a70 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
13a80 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
13a90 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
13aa0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
13ab0 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
13ac0 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
13ad0 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
13ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13af0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
13b00 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13b10 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
13b20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
13b30 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
13b40 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
13b50 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
13b60 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
13b70 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
13b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13b90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
13bb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
13bc0 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
13bd0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
13be0 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
13bf0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
13c00 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
13c10 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
13c20 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
13c30 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
13c40 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
13c50 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
13c60 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
13c70 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
13c80 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
13c90 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
13ca0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
13cb0 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
13cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13cd0 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
13ce0 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
13cf0 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
13d00 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
13d10 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
13d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13d30 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
13d40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
13d50 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
13d60 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65  .    if( aSample
13d70 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [0].eType==SQLIT
13d80 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20  E_NULL ) isEq = 
13d90 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
13da0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
13db0 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
13dc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
13dd0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
13de0 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
13df0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
13e00 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
13e10 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
13e20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  || aSample[i].eT
13e30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
13e40 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
13e50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13e60 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
13e70 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20  >nSample ){     
13e80 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
13e90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13ea0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
13eb0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
13ec0 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
13ed0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
13ee0 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
13ef0 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
13f00 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
13f10 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
13f20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
13f30 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
13f40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
13f50 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
13f60 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
13f70 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
13f80 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
13f90 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53 51  llSeq(pParse, SQ
13fa0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70  LITE_UTF8, 0, *p
13fb0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
13fc0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
13fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13ff0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
14000 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
14010 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61  t u8 *)sqlite3Va
14020 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43  lueText(pVal, pC
14030 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20  oll->enc);.     
14040 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20     if( !z ){.   
14050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
14080 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c  sert( z && pColl
14090 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
140a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
140b0 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75   n = sqlite3Valu
140c0 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f  eBytes(pVal, pCo
140d0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20  ll->enc);.  .   
140e0 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d     for(; i<pIdx-
140f0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
14100 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
14110 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70         int eSamp
14120 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65  letype = aSample
14130 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  [i].eType;.     
14140 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
14150 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69  pe<eType ) conti
14160 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
14170 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54   eSampletype!=eT
14180 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66  ype ) break;.#if
14190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
141a0 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69  _UTF16.        i
141b0 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53  f( pColl->enc!=S
141c0 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
141d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d          int nSam
141e0 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ple;.          c
141f0 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73  har *zSample = s
14200 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a  qlite3Utf8to16(.
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
14220 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53  , pColl->enc, aS
14230 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53  ample[i].u.z, aS
14240 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20  ample[i].nByte, 
14250 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20  &nSample.       
14260 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
14270 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a  if( !zSample ){.
14280 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14290 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
142a0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
142b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
142c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
142d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
142e0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
142f0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61  Coll->pUser, nSa
14300 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e  mple, zSample, n
14310 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
14320 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14330 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  , zSample);.    
14340 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
14350 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
14360 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
14370 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
14380 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  r, aSample[i].nB
14390 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  yte, aSample[i].
143a0 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  u.z, n, z);.    
143b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
143c0 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c>=0 ){.      
143d0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69      if( c==0 ) i
143e0 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sEq = 1;.       
143f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14400 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14410 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
14420 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70  his point, aSamp
14430 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
14440 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  st sample that i
14450 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  s greater than. 
14460 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
14470 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d  pVal.  Or if i==
14480 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74  pIdx->nSample, t
14490 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  hen all samples 
144a0 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68  are less.  ** th
144b0 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61  an pVal.  If aSa
144c0 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74  mple[i]==pVal, t
144d0 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a  hen isEq==1..  *
144e0 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a  /.  if( isEq ){.
144f0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
14500 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
14510 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
14520 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
14530 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
14540 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d  mple[i].nEq;.  }
14550 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
14560 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
14570 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
14580 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
14590 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
145a0 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
145b0 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c  [0].nLt;.    }el
145c0 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
145d0 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
145e0 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c  ple ? n : aSampl
145f0 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20  e[i].nLt;.      
14600 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
14610 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d  [i-1].nEq + aSam
14620 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20  ple[i-1].nLt;.  
14630 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
14640 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a   = pIdx->avgEq;.
14650 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
14660 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
14670 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
14680 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
14690 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
146a0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
146b0 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
146c0 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
146d0 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
146e0 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
146f0 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
14700 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
14710 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
14720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14740 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14750 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
14760 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
14770 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
14780 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
14790 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
147a0 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
147b0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
147c0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
147d0 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
147e0 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
147f0 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
14800 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
14810 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
14820 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
14830 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
14840 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
14850 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
14860 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
14870 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
14880 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
14890 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
148a0 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
148b0 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
148c0 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
148d0 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
148e0 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
148f0 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
14900 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
14910 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
14920 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
14930 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
14940 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
14950 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
14960 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
14970 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
14980 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
14990 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
149a0 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
149b0 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
149c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
149d0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
149e0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
149f0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
14a00 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14a10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
14a20 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
14a30 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
14a40 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
14a50 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
14a60 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
14a70 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
14a80 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
14a90 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
14aa0 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
14ab0 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
14ac0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
14ad0 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
14ae0 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
14af0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
14b00 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
14b10 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
14b20 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70  e, iVar);.    *p
14b30 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
14b40 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
14b50 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
14b60 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
14b70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14b80 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
14b90 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
14ba0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
14bb0 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
14bc0 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
14bd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
14be0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14bf0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
14c00 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
14c10 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
14c20 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
14c30 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
14c40 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
14c50 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
14c60 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
14c70 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
14c80 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
14c90 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
14ca0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
14cb0 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
14cc0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
14cd0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
14ce0 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
14cf0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
14d00 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
14d10 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
14d20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
14d30 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
14d40 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
14d50 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
14d60 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
14d70 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
14d80 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
14db0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14dc0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
14dd0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
14de0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
14df0 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
14e00 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
14e10 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
14e20 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
14e30 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
14e40 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
14e50 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
14e60 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
14e70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
14e80 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
14e90 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
14ea0 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
14eb0 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
14ec0 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
14ed0 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
14ee0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
14ef0 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
14f00 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
14f10 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
14f20 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
14f30 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
14f40 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
14f50 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
14f60 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
14f70 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
14f80 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
14f90 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
14fa0 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
14fb0 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
14fc0 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
14fd0 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
14fe0 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
14ff0 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
15000 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
15010 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
15020 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
15030 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
15040 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
15050 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
15060 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
15070 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
15080 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
15090 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
150a0 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65  er divisor to re
150b0 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
150c0 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61  ed.** search spa
150d0 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61  ce.  A return va
150e0 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74  lue of 1 means t
150f0 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  hat range constr
15100 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20  aints are.** no 
15110 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20  help at all.  A 
15120 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
15130 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f  2 means range co
15140 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
15150 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64   expected to red
15160 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
15170 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41  pace by half.  A
15180 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a  nd so forth....*
15190 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
151a0 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
151b0 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at3 ANALYZE data
151c0 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
151d0 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
151e0 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
151f0 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
15200 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73  of 4.  Hence a s
15210 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
15220 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74   (x>?).** result
15230 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  s in a return of
15240 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63   4 and a range c
15250 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41  onstraint (x>? A
15260 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a  ND x<?) results.
15270 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ** in a return o
15280 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 16..*/.static 
15290 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
152a0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
152b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
152c0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
152d0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
152e0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
152f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15300 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  The index contai
15310 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63  ning the range-c
15320 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20  ompared column; 
15330 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  "x" */.  int nEq
15340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15350 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61   index into p->a
15360 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e  Col[] of the ran
15370 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
15380 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  mn */.  WhereTer
15390 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
153a0 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
153b0 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
153c0 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
153d0 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
153e0 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
153f0 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
15400 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
15410 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
15420 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  NULL */.  double
15430 20 2a 70 52 61 6e 67 65 44 69 76 20 20 20 2f 2a   *pRangeDiv   /*
15440 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61   OUT: Reduce sea
15450 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69  rch space by thi
15460 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a  s divisor */.){.
15470 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15480 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
15490 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
154a0 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  3..  if( nEq==0 
154b0 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  && p->nSample ){
154c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
154d0 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20  ue *pRangeVal;. 
154e0 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
154f0 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63  r = 0;.    tRowc
15500 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61  nt iUpper = p->a
15510 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
15520 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
15530 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54    u8 aff = p->pT
15540 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
15550 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
15560 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  ity;..    if( pL
15570 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  ower ){.      Ex
15580 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
15590 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
155a0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61  t;.      rc = va
155b0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
155c0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
155d0 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  &pRangeVal);.   
155e0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77     assert( (pLow
155f0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
15600 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
15610 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  0 );.      if( r
15620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
15630 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53      && whereKeyS
15640 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
15650 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29  pRangeVal, 0, a)
15660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
15670 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f    ){.        iLo
15680 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
15690 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d      if( (pLower-
156a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
156b0 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20  GT)!=0 ) iLower 
156c0 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
156d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
156e0 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
156f0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
15700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15710 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
15720 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15730 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
15740 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
15750 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
15760 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
15770 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
15780 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15790 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
157a0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
157b0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
157c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
157d0 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
157e0 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
157f0 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
15800 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
15810 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
15820 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
15830 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55  .        if( (pU
15840 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
15850 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55  & WO_LE)!=0 ) iU
15860 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  pper += a[1];.  
15870 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15880 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61  te3ValueFree(pRa
15890 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ngeVal);.    }. 
158a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
158b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
158c0 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72  ( iUpper<=iLower
158d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61   ){.        *pRa
158e0 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
158f0 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  )p->aiRowEst[0];
15900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15910 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76        *pRangeDiv
15920 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69   = (double)p->ai
15930 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c  RowEst[0]/(doubl
15940 65 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  e)(iUpper - iLow
15950 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
15960 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28     /*WHERETRACE(
15970 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67  ("range scan reg
15980 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69  ions: %u..%u  di
15990 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  v=%g\n",.       
159a0 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
159b0 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
159c0 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29  per, *pRangeDiv)
159d0 29 3b 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  );*/.      retur
159e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
159f0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
15a00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15a10 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
15a20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
15a30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
15a40 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a  ER(nEq);.#endif.
15a50 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
15a60 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
15a70 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
15a80 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c  uble)1;.  if( pL
15a90 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
15aa0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
15ab0 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61  VNULL)==0 ) *pRa
15ac0 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c  ngeDiv *= (doubl
15ad0 65 29 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65  e)4;.  if( pUppe
15ae0 72 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a  r ) *pRangeDiv *
15af0 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72  = (double)4;.  r
15b00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15b10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15b20 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT3./*.** Es
15b30 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
15b40 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
15b50 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
15b60 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
15b70 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15b80 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
15b90 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
15ba0 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
15bb0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
15bc0 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
15bd0 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
15be0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
15bf0 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
15c00 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
15c10 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
15c20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
15c30 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
15c40 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
15c50 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
15c60 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
15c70 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
15c80 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
15c90 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
15ca0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
15cb0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
15cc0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
15cd0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
15ce0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
15cf0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
15d00 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
15d10 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
15d20 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
15d30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15d40 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
15d50 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
15d60 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
15d70 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
15d80 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
15d90 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
15da0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
15db0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
15dc0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
15dd0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
15de0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
15df0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
15e00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
15e10 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
15e20 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
15e30 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
15e40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15e50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
15e60 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
15e70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
15e80 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15e90 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
15ea0 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
15eb0 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
15ec0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
15ed0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
15ee0 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
15ef0 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
15f00 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64  onstraint */.  d
15f10 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
15f20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
15f30 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
15f40 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
15f50 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15f60 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20   *pRhs = 0;  /* 
15f70 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68  VALUE on right-h
15f80 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72  and side of pTer
15f90 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20  m */.  u8 aff;  
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
15fc0 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
15ff0 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
16000 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16020 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20  Statistics */.. 
16030 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
16040 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
16050 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
16060 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
16070 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
16080 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
16090 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
160a0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
160b0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
160c0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
160d0 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
160e0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
160f0 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
16100 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
16110 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
16120 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
16130 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
16140 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
16150 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
16160 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79  .  rc = whereKey
16170 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
16180 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20   pRhs, 0, a);.  
16190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
161a0 4b 20 29 7b 0a 20 20 20 20 2f 2a 57 48 45 52 45  K ){.    /*WHERE
161b0 54 52 41 43 45 28 28 22 65 71 75 61 6c 69 74 79  TRACE(("equality
161c0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
161d0 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
161e0 29 3b 2a 2f 0a 20 20 20 20 2a 70 6e 52 6f 77 20  );*/.    *pnRow 
161f0 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72  = a[1];.  }.wher
16200 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
16210 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  ncel:.  sqlite3V
16220 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a  alueFree(pRhs);.
16230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16240 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
16250 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
16260 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TAT3) */..#ifdef
16270 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16280 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
16290 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
162a0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
162b0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
162c0 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
162d0 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
162e0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
162f0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
16300 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
16310 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
16320 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
16330 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
16340 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
16350 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
16360 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
16370 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
16380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
16390 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
163a0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
163b0 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
163c0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
163d0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
163e0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
163f0 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
16400 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
16410 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
16420 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
16430 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
16440 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
16450 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
16460 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
16470 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
16480 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
16490 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
164a0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
164b0 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
164c0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
164d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
164e0 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
164f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16500 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16510 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
16520 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16530 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
16540 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
16550 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
16560 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
16570 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  m */.  ExprList 
16580 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
16590 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
165a0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
165b0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
165c0 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  " */.  double *p
165d0 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
165e0 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
165f0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
16600 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
16610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16620 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
16630 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
16640 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45  e */.  double nE
16650 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
16660 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16670 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
16680 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62  e term */.  doub
16690 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f  le nRowEst = (do
166a0 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65  uble)0; /* New e
166b0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
166c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
166d0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
16700 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
16710 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
16720 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
16730 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
16740 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
16750 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69      nEst = p->ai
16760 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72  RowEst[0];.    r
16770 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
16780 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c  anEst(pParse, p,
16790 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
167a0 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
167b0 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
167c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
167d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
167e0 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
167f0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
16800 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
16810 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
16820 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
16830 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28     /*WHERETRACE(
16840 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
16850 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
16860 6f 77 45 73 74 29 29 3b 2a 2f 0a 20 20 7d 0a 20  owEst));*/.  }. 
16870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
16880 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
16890 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
168a0 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  AT3) */../*.** D
168b0 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
168c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
168d0 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
168e0 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
168f0 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
16900 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
16910 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
16920 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
16930 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
16940 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
16950 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
16960 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
16970 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
16980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
16990 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
169a0 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
169b0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
169c0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
169d0 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
169e0 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
169f0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
16a00 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
16a10 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
16a20 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
16a30 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
16a40 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
16a50 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
16a60 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
16a70 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
16a80 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
16a90 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
16aa0 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
16ab0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
16ac0 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
16ad0 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
16ae0 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
16af0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
16b00 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
16b10 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
16b20 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  isabled..**.** I
16b30 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
16b40 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20  : R-24597-58655 
16b50 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e  No tests are don
16b60 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  e for terms that
16b70 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65   are.** complete
16b80 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ly satisfied by 
16b90 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44  indices..**.** D
16ba0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
16bb0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
16bc0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
16bd0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
16be0 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
16bf0 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
16c00 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
16c10 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
16c20 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
16c30 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
16c40 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
16c50 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
16c60 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
16c70 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
16c80 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
16c90 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
16ca0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
16cb0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
16cc0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
16cd0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
16ce0 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
16cf0 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
16d00 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
16d10 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
16d20 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
16d30 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
16d40 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
16d50 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
16d60 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
16d70 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
16d80 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
16d90 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
16da0 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
16db0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
16dc0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
16dd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16de0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
16df0 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
16e00 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
16e10 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
16e20 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
16e30 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
16e40 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
16e50 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
16e60 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
16e70 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
16e80 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
16e90 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
16ea0 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
16eb0 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
16ec0 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
16ed0 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
16ee0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
16ef0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
16f00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
16f10 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
16f20 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
16f30 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
16f40 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
16f50 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
16f60 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
16f70 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
16f80 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
16f90 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
16fa0 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
16fb0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
16fc0 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
16fd0 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
16fe0 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
16ff0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
17000 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
17010 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
17020 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
17030 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
17040 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
17050 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17060 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
17070 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
17080 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
17090 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
170a0 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
170b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
170c0 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
170d0 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
170e0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
170f0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
17100 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
17110 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
17120 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17130 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
17140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17150 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
17160 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
17170 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
17180 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
17190 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
171a0 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
171b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
171c0 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
171d0 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
171e0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
171f0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
17200 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
17210 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
17220 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
17230 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
17240 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
17250 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
17260 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
17270 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
17280 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
17290 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
172a0 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
172b0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
172c0 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
172d0 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
172e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
172f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
17300 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
17310 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17320 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
17330 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
17340 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17350 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17360 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
17370 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
17380 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
17390 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
173a0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
173b0 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
173c0 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
173d0 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
173e0 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
173f0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
17400 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
17410 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
17420 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
17430 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
17440 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
17450 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
17460 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
17470 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
17480 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
17490 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
174a0 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
174b0 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
174c0 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
174d0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
174e0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
174f0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
17500 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
17510 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
17520 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
17530 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
17540 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
17550 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
17560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17570 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
17580 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
17590 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
175a0 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
175b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
175c0 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
175d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
175e0 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
175f0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
17600 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
17610 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
17620 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
17630 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
17640 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
17650 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
17660 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
17670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17680 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
17690 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
176a0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
176b0 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
176c0 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
176d0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
176e0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
176f0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
17700 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
17710 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
17720 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
17750 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
17760 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
17770 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
17780 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
17790 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
177a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
177b0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
177c0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
177d0 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
177e0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
177f0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
17800 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
17810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17820 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
17830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17840 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
17850 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
17860 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
17870 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
17880 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
17890 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
178a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
178b0 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
178c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
178d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
178e0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
178f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
17900 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
17910 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
17920 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
17930 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
17940 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
17950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
17960 74 63 61 73 65 28 20 69 45 71 3d 3d 70 4c 65 76  tcase( iEq==pLev
17970 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
17980 3e 6e 43 6f 6c 75 6d 6e 2d 31 20 29 3b 0a 20 20  >nColumn-1 );.  
17990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
179a0 71 3e 30 20 26 26 20 69 45 71 2b 31 3c 70 4c 65  q>0 && iEq+1<pLe
179b0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
179c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
179d0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
179e0 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
179f0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
17a00 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
17a10 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
17a20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
17a30 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
17a40 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
17a50 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20  Parse, pX, 0);. 
17a60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
17a70 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
17a80 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  C ){.      testc
17a90 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
17aa0 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
17ab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20  .    }.    iTab 
17ac0 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
17ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ae0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
17af0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
17b00 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
17b10 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
17b20 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
17b30 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b  _MULTI_OR)==0 );
17b40 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
17b50 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f  ags |= WHERE_IN_
17b60 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c  ABLE;.    if( pL
17b70 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
17b80 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
17b90 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
17ba0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17bb0 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
17bc0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
17bd0 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
17be0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
17bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
17c00 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
17c10 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
17c20 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20  >u.in.aInLoop,. 
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17c50 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
17c60 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
17c70 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
17c80 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
17c90 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
17ca0 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
17cb0 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
17cc0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
17cd0 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
17ce0 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
17cf0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
17d00 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
17d10 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
17d20 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
17d30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
17d40 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
17d50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17d60 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
17d70 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
17d80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17d90 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
17da0 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
17db0 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c        pIn->eEndL
17dc0 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  oopOp = bRev ? O
17dd0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
17de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17df0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17e00 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20  IsNull, iReg);. 
17e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17e20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
17e30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
17e40 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
17e50 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
17e60 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
17e70 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
17e80 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
17e90 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
17ea0 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
17eb0 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
17ec0 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46  * index..**.** F
17ed0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
17ee0 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
17ef0 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
17f00 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
17f10 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
17f20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
17f30 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
17f40 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
17f50 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
17f60 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
17f70 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
17f80 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17f90 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
17fa0 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
17fb0 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
17fc0 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
17fd0 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
17fe0 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
17ff0 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
18000 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
18010 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18020 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
18030 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
18040 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
18050 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
18060 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
18070 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
18080 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
18090 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
180a0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
180b0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
180c0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
180d0 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
180e0 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
180f0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
18100 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
18110 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
18120 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
18130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
18140 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
18150 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
18160 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
18170 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
18180 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
18190 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20   and.** compute 
181a0 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
181b0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
181c0 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
181d0 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
181e0 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
181f0 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  l and returns.**
18200 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
18210 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  at memory cell. 
18220 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
18230 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
18240 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
18250 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  t memory cell to
18260 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
18270 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
18280 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
18290 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
182a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
182b0 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
182c0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
182d0 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
182e0 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
182f0 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
18300 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
18310 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
18320 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
18330 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
18340 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
18350 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
18360 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
18370 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
18380 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
18390 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
183a0 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
183b0 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
183c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
183d0 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
183e0 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
183f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
18400 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
18410 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
18420 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
18430 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
18440 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
18450 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
18460 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
18470 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
18480 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
18490 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
184a0 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
184b0 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
184c0 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
184d0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
184e0 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
184f0 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
18500 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
18510 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
18520 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
18530 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
18540 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
18550 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
18560 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
18570 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
18580 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
18590 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
185a0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
185b0 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
185c0 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
185d0 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
185e0 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
185f0 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
18600 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
18610 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
18620 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
18630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
18640 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
18650 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
18660 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18670 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18680 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
18690 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
186a0 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
186b0 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
186c0 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
186d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
186e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
186f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
18700 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
18710 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
18720 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
18730 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
18740 64 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  d */.  int bRev,
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18760 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
18770 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
18780 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
18790 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
187a0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
187b0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
187c0 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
187d0 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
187e0 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
187f0 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
18800 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
18810 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18830 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
18840 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
18850 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
18860 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
18870 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
18880 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
18890 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
188a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
188d0 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
188e0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
188f0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
18900 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
18910 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
18920 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
18930 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
18940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18950 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
18960 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18990 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
189a0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
189b0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
189c0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
189d0 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
189e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
189f0 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
18a00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
18a10 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
18a40 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
18a50 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
18a60 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
18a70 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
18a80 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
18a90 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
18aa0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
18ab0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
18ac0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
18ad0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
18ae0 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
18af0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
18b00 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70  ;.  pIdx = pLoop
18b10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
18b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
18b30 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  !=0 );..  /* Fig
18b40 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
18b50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
18b60 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
18b70 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
18b80 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
18b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
18ba0 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70  ;.  nReg = pLoop
18bb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20  ->u.btree.nEq + 
18bc0 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
18bd0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
18be0 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
18bf0 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
18c00 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
18c10 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
18c20 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
18c30 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
18c40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18c50 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
18c60 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
18c70 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
18c80 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
18c90 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
18ca0 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
18cb0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
18cc0 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
18cd0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
18ce0 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20  oop->aTerm[j];. 
18cf0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
18d00 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
18d10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65  e following true
18d20 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
18d30 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
18d40 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
18d50 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
18d60 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
18d70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
18d80 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
18d90 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
18da0 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
18db0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
18dc0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
18dd0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
18de0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
18df0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
18e00 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
18e10 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
18e20 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
18e30 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
18e40 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65  j, bRev, regBase
18e50 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
18e60 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
18e70 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
18e80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18ea0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
18eb0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
18ec0 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
18ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
18ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18ef0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
18f00 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
18f10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
18f20 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
18f30 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
18f40 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
18f50 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
18f60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
18f70 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
18f80 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
18f90 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
18fa0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
18fb0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
18fc0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
18fd0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
18fe0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
18ff0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
19000 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
19010 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
19020 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
19030 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19040 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
19050 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
19060 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
19070 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
19080 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
19090 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
190a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
190b0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
190c0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
190d0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
190e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
190f0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
19100 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
19110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19120 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
19130 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
19140 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
19150 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19160 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
19170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19180 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
19190 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
191a0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
191b0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
191c0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
191d0 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
191e0 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
191f0 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
19200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
19210 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
19220 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
19230 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
19240 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
19250 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
19260 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
19270 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
19280 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
19290 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
192a0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
192b0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
192c0 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
192d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
192e0 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
192f0 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
19300 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
19310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19320 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
19330 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
19340 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
19350 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
19360 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19370 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
19380 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
19390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
193a0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
193b0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
193c0 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
193d0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
193e0 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
193f0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
19400 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
19410 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
19420 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
19430 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
19440 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
19450 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
19460 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
19470 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
19480 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
19490 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
194a0 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
194b0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
194c0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
194d0 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
194e0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
194f0 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
19500 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
19510 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
19520 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
19530 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
19540 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
19550 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
19560 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
19570 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
19580 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
19590 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
195a0 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
195b0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
195c0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
195d0 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
195e0 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
195f0 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
19600 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
19610 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
19620 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
19630 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
19640 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
19650 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
19660 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
19670 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
19680 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
19690 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
196a0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
196b0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
196c0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
196d0 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
196e0 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
196f0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
19700 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
19710 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
19720 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
19730 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c  oop *pLoop, Tabl
19740 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
19750 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  x *pIndex = pLoo
19760 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19770 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
19780 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
19790 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  q;.  int i, j;. 
197a0 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
197b0 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e  pTab->aCol;.  in
197c0 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49  t *aiColumn = pI
197d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a  ndex->aiColumn;.
197e0 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a    StrAccum txt;.
197f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
19800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19810 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c  f( nEq==0 && (pL
19820 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
19830 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
19840 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
19850 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
19860 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
19870 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
19880 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49  &txt, 0, 0, SQLI
19890 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
198a0 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20    txt.db = db;. 
198b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
198c0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28  Append(&txt, " (
198d0 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 2);.  for(i=0
198e0 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<nEq; i++){. 
198f0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
19900 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43  Term(&txt, i, aC
19910 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  ol[aiColumn[i]].
19920 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d  zName, "=");.  }
19930 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
19940 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
19950 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
19960 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
19970 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
19980 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
19990 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
199a0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
199b0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
199c0 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
199d0 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
199e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
199f0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
19a00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
19a10 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
19a20 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
19a30 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
19a40 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
19a50 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
19a60 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
19a70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19a80 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
19a90 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
19aa0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
19ab0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
19ac0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
19ad0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19ae0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
19af0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
19b00 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
19b10 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
19b20 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
19b30 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
19b40 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
19b50 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
19b60 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
19b70 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
19b80 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
19b90 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
19ba0 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
19bb0 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
19bc0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
19bd0 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
19be0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
19bf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
19c00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
19c10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c30 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
19c40 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
19c50 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
19c60 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
19c70 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
19c80 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
19c90 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
19ca0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
19cd0 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
19ce0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
19cf0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
19d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
19d10 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
19d20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
19d30 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
19d40 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
19d50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
19d60 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
19d70 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
19d80 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
19d90 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
19da0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
19db0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
19dc0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
19dd0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
19de0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19df0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
19e00 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
19e10 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
19e20 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19e30 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
19e40 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
19e50 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
19e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19e70 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
19e80 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
19e90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
19ea0 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20  int64 nRow;     
19eb0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
19ec0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
19ed0 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e   visited by scan
19ee0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
19ef0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
19f00 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
19f10 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
19f20 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
19f30 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
19f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19f50 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
19f60 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
19f70 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
19f80 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19fa0 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
19fb0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
19fc0 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
19fd0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19fe0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
19ff0 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
1a000 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70  s loop */..    p
1a010 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
1a020 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
1a030 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
1a040 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
1a050 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
1a060 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
1a070 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
1a080 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
1a090 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
1a0a0 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
1a0b0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
1a0c0 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
1a0d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
1a0e0 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
1a0f0 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
1a100 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1a110 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
1a120 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
1a130 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
1a140 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
1a150 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
1a160 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1a170 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
1a180 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
1a190 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
1a1a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1a1b0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1a1c0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1a1d0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
1a1e0 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
1a1f0 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
1a200 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1a210 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1a220 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1a230 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
1a240 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
1a250 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
1a260 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1a270 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1a280 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1a290 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1a2a0 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
1a2b0 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
1a2c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a2d0 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
1a2e0 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
1a2f0 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20  ALTABLE))==0.   
1a300 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
1a310 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20  ree.pIndex!=0.  
1a320 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
1a330 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
1a340 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
1a350 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54  pLoop, pItem->pT
1a360 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ab);.      zMsg 
1a370 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1a380 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1a390 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25  USING %s%sINDEX%
1a3a0 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20  s%s%s", zMsg, . 
1a3b0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1a3c0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1a3d0 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20  DEX)?"AUTOMATIC 
1a3e0 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
1a3f0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1a400 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45  _IDX_ONLY)?"COVE
1a410 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20  RING ":""),.    
1a420 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
1a430 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
1a440 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20  )?"":" "),.     
1a450 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1a460 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
1a470 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ?"": pLoop->u.bt
1a480 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
1a490 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57  e),.          zW
1a4a0 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
1a4b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1a4c0 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
1a4d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1a4e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1a4f0 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1a500 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
1a510 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
1a520 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1a530 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1a540 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
1a550 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
1a560 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
1a570 61 67 73 26 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ags&WHERE_COLUMN
1a580 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _EQ ){.        z
1a590 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1a5a0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1a5b0 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
1a5c0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
1a5d0 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1a5e0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1a5f0 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1a600 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
1a610 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1a620 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1a630 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
1a640 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
1a650 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a660 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
1a670 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1a680 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1a690 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1a6a0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
1a6b0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1a6c0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1a6d0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1a6e0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1a6f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1a700 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1a710 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
1a720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a740 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a750 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
1a760 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
1a770 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1a780 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1a790 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1a7a0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
1a7b0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
1a7c0 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1a7f0 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  dxNum, pLoop->u.
1a800 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1a810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
1a820 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57  f( wctrlFlags&(W
1a830 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1a840 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
1a850 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  AX) ){.      tes
1a860 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
1a870 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1a880 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e  Y_MIN );.      n
1a890 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Row = 1;.    }el
1a8a0 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d  se{.      nRow =
1a8b0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1a8c0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  pLoop->nOut;.   
1a8d0 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71   }.    zMsg = sq
1a8e0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1a8f0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c  , zMsg, "%s (~%l
1a900 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c  ld rows)", zMsg,
1a910 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69   nRow);.    sqli
1a920 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a930 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
1a940 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
1a950 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
1a960 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
1a970 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
1a980 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
1a990 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
1a9a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1a9b0 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
1a9c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1a9d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1a9e0 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
1a9f0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1aa00 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
1aa10 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
1aa20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
1aa30 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
1aa40 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
1aa50 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1aa60 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
1aa70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
1aa80 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
1aa90 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1aaa0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
1aab0 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
1aac0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
1aad0 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
1aae0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1aaf0 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
1ab00 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
1ab10 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
1ab20 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
1ab30 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
1ab40 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
1ab50 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
1ab60 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
1ab70 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
1ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ab90 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1aba0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1abb0 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1abc0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
1abd0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
1abe0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
1abf0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1ac00 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1ac10 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
1ac20 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
1ac30 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
1ac40 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
1ac50 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
1ac60 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
1ac70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1ac80 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
1ac90 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1aca0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
1acb0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
1acc0 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
1acd0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1ace0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1acf0 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
1ad00 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
1ad10 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
1ad20 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1ad30 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
1ad40 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
1ad50 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
1ad60 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1ad70 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1ad80 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
1ad90 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
1ada0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1add0 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ext */.  Vdbe *v
1ade0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1adf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ae00 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
1ae10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1ae20 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1ae30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1ae40 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
1ae50 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
1ae60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1ae70 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1ae90 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
1aea0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
1aeb0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
1aec0 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
1aed0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1aee0 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
1aef0 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
1af00 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
1af10 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
1af20 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
1af30 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
1af40 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
1af50 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
1af60 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
1af70 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1af80 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
1af90 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69  eturning */.  Bi
1afa0 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64  tmask newNotRead
1afb0 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  y;      /* Retur
1afc0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50  n value */..  pP
1afd0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1afe0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1aff0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1b000 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
1b010 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1b020 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1b030 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1b040 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
1b050 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
1b060 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1b070 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
1b080 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1b090 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d  Cursor;.  bRev =
1b0a0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
1b0b0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
1b0c0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
1b0d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1b0e0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
1b0f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1b100 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
1b110 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
1b120 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  ==0;.  VdbeNoopC
1b130 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1b140 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c  n Join Loop %d",
1b150 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a   iLevel));..  /*
1b160 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
1b170 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
1b180 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
1b190 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
1b1a0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1b1b0 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
1b1c0 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
1b1d0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
1b1e0 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
1b1f0 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
1b200 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
1b210 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
1b220 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
1b230 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
1b240 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
1b250 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
1b260 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
1b270 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
1b280 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
1b290 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
1b2a0 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
1b2b0 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
1b2c0 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
1b2d0 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
1b2e0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
1b2f0 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
1b300 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1b310 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
1b320 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
1b330 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
1b340 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1b350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b360 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
1b370 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
1b380 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
1b390 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b3a0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
1b3b0 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
1b3c0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1b3d0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
1b3e0 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
1b3f0 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
1b400 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
1b410 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
1b420 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
1b430 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
1b440 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
1b450 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
1b460 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
1b470 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
1b480 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
1b490 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
1b4a0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1b4b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1b4c0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1b4d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1b4e0 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
1b4f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
1b500 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1b510 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
1b520 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
1b530 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  "));.  }..  /* S
1b540 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
1b550 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62   FROM clause sub
1b560 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65  query implemente
1b570 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
1b580 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49  e */.  if( pTabI
1b590 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
1b5a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  e ){.    int reg
1b5b0 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d  Yield = pTabItem
1b5c0 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
1b5d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b5e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1b5f0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
1b600 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69  FillSub-1, regYi
1b610 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  eld);.    pLevel
1b620 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1b630 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1b640 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
1b650 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1b660 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
1b670 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73  of co-routine %s
1b680 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
1b690 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
1b6a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b6b0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59  2(v, OP_If, regY
1b6c0 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29  ield+1, addrBrk)
1b6d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1b6e0 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
1b6f0 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1b700 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1b710 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1b720 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b730 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1b740 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
1b750 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
1b760 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
1b770 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
1b780 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
1b790 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1b7a0 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
1b7b0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1b7c0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
1b7d0 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
1b7e0 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
1b7f0 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
1b800 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1b810 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 54  aint = pLoop->nT
1b820 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1b830 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1b840 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1b850 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1b860 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1b870 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1b880 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1b890 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1b8a0 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1b8b0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1b8c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1b8d0 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1b8e0 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1b8f0 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d   pLoop->aTerm[j]
1b900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1b910 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1b920 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1b930 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1b940 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1b950 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1b960 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1b970 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1b980 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b990 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1b9a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b9b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b9c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1b9d0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1b9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ba00 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1ba10 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1ba20 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1ba30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ba40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1ba50 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1ba60 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1ba70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ba80 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1ba90 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1baa0 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1bad0 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1baf0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1bb00 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1bb10 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1bb20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1bb30 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1bb40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1bb50 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
1bb60 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1bb70 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
1bb80 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
1bb90 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1bba0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1bbb0 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d 29 3b  Loop->aTerm[j]);
1bbc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bbd0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1bbe0 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
1bbf0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1bc00 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1bc10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1bc20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1bc30 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1bc40 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1bc50 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
1bc60 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
1bc70 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1bc80 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
1bc90 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1bca0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1bcb0 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
1bcc0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1bcd0 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
1bce0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1bcf0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
1bd00 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1bd10 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
1bd20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
1bd30 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
1bd40 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
1bd50 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
1bd60 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
1bd70 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
1bd80 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1bd90 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
1bda0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
1bdb0 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
1bdc0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
1bdd0 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
1bde0 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
1bdf0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
1be00 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1be10 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1be20 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
1be30 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
1be40 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1be50 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1be60 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1be70 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1be80 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1be90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1bea0 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
1beb0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1bec0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1bed0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1bee0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1bef0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1bf00 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1bf10 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
1bf20 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1bf30 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1bf40 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1bf50 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1bf60 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1bf70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1bf80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bf90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1bfa0 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1bfb0 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
1bfc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bfd0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
1bfe0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
1bff0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
1c000 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1c010 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1c020 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
1c030 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
1c040 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1c050 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1c060 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1c070 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1c080 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1c090 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1c0a0 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
1c0b0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1c0c0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1c0d0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1c0e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1c0f0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
1c100 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
1c110 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
1c120 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
1c130 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1c140 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1c150 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
1c160 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
1c170 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
1c180 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
1c190 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
1c1a0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1c1b0 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
1c1c0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1c1d0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
1c1e0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
1c1f0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
1c200 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1c210 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1c220 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
1c230 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b   pLoop->aTerm[j+
1c240 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  +];.    if( pLoo
1c250 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1c260 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70  RE_TOP_LIMIT ) p
1c270 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65  End = pLoop->aTe
1c280 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1c290 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
1c2a0 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
1c2b0 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
1c2c0 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
1c2d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
1c2e0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1c2f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
1c300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c310 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
1c320 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
1c330 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
1c340 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
1c350 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
1c360 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
1c370 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
1c380 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
1c390 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c3a0 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
1c3b0 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
1c3c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
1c3d0 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
1c3e0 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
1c3f0 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
1c400 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
1c410 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
1c420 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
1c430 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
1c440 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
1c450 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20    OP_SeekGt,.   
1c460 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
1c470 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a   */  OP_SeekLe,.
1c480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1c490 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
1c4a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1c4b0 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
1c4c0 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGe.      };.  
1c4d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1c4e0 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
1c4f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
1c500 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
1c510 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1c520 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
1c530 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
1c540 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
1c550 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
1c560 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
1c570 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
1c580 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
1c590 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  t. */..      tes
1c5a0 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
1c5b0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1c5c0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
1c5d0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
1c5e0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1c5f0 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1c600 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1c610 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c620 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73  pStart->leftCurs
1c630 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
1c640 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1c650 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1c660 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1c670 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1c680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c690 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1c6a0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1c6b0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1c6c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1c6d0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1c6e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c6f0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1c700 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1c710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1c720 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c730 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1c740 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1c750 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1c760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c780 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1c790 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1c7a0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1c7b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c7c0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1c7d0 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1c7e0 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1c7f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1c800 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1c810 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43  ert( pEnd->leftC
1c820 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
1c830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c840 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1c850 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
1c860 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
1c870 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d  662 */.      mem
1c880 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1c890 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1c8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8b0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1c8c0 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1c8d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1c8e0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1c8f0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1c900 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1c910 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1c920 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1c930 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1c940 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1c950 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1c960 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1c970 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1c980 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1c990 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1c9a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1c9b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1c9c0 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1c9d0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1c9e0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1c9f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1ca00 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66   = start;.    if
1ca10 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70  ( pStart==0 && p
1ca20 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  End==0 ){.      
1ca30 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
1ca40 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
1ca50 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
1ca60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ca70 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1ca80 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
1ca90 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
1caa0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
1cab0 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
1cac0 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
1cad0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1cae0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1caf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cb00 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1cb10 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1cb20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1cb30 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1cb40 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1cb50 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1cb60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1cb70 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1cb80 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1cb90 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1cba0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1cbb0 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1cbc0 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1cbd0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1cbe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1cbf0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cc00 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1cc10 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1cc20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1cc30 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1cc40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1cc50 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1cc60 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1cc70 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1cc80 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1cc90 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1cca0 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1ccb0 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1ccc0 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1ccd0 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1cce0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1ccf0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1cd00 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1cd10 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1cd20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1cd30 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1cd40 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1cd50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1cd60 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1cd70 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1cd80 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1cd90 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1cda0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1cdb0 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1cdc0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1cdd0 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1cde0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1cdf0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1ce00 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1ce10 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1ce20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1ce30 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1ce40 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1ce50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1ce60 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1ce70 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1ce80 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1ce90 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1cea0 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1ceb0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1cec0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1ced0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1cee0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1cef0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1cf00 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1cf10 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1cf20 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1cf30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1cf40 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1cf50 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1cf60 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1cf70 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1cf80 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1cf90 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1cfa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1cfb0 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1cfc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1cfd0 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1cfe0 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1cff0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1d000 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1d010 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1d020 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1d030 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1d040 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1d050 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1d060 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1d070 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1d080 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1d090 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1d0a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1d0b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d0c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1d0d0 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1d0e0 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1d0f0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1d100 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1d110 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1d120 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1d130 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1d140 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1d150 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1d160 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1d170 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1d180 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1d190 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1d1a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1d1b0 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1d1c0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1d1d0 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1d1e0 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1d1f0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1d200 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1d210 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1d220 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGt,           /
1d230 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1d240 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1d250 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1d260 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1d270 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1d280 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1d290 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1d2a0 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1d2b0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c        OP_SeekGe,
1d2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1d2d0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1d2e0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1d2f0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1d300 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20      OP_SeekLe   
1d310 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1d320 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1d330 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1d340 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1d350 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1d360 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1d370 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  = {.      OP_Noo
1d380 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d390 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
1d3a0 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
1d3b0 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
1d3c0 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
1d3d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1d3e0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1d3f0 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20  OP_IdxLT        
1d400 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
1d410 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62  constraints && b
1d420 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1d430 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f     int nEq = pLo
1d440 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1d450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
1d460 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
1d470 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
1d480 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
1d490 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1d4a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
1d4b0 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
1d4c0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73  /.    int regBas
1d4d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d4e0 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
1d4f0 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73  ter holding cons
1d500 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f  traint values */
1d510 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20  .    int r1;    
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
1d540 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  er */.    WhereT
1d550 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
1d560 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
1d570 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1d580 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
1d590 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1d5a0 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
1d5b0 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
1d5c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1d5d0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
1d5e0 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d600 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
1d610 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
1d620 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1d630 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
1d640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d650 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
1d660 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1d670 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1d680 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
1d690 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
1d6a0 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
1d6b0 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
1d6c0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
1d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d6e0 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
1d6f0 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
1d700 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1d710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d720 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
1d730 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
1d740 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d760 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1d770 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
1d780 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
1d790 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1d7a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d7b0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1d7c0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
1d7d0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1d7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d7f0 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
1d800 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
1d810 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
1d820 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1d830 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
1d840 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
1d850 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64  /.    char *zEnd
1d860 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
1d870 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
1d880 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
1d890 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
1d8a0 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
1d8b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1d8c0 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
1d8d0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
1d8e0 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49      k = (nEq==pI
1d8f0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31  dx->nColumn ? -1
1d900 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   : pIdx->aiColum
1d910 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a  n[nEq]);..    /*
1d920 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
1d930 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
1d940 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
1d950 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
1d960 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
1d970 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1d980 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
1d990 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
1d9a0 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
1d9b0 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
1d9c0 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
1d9d0 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
1d9e0 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
1d9f0 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
1da00 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1da10 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
1da20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
1da30 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
1da40 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
1da50 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
1da60 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
1da70 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
1da80 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
1da90 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1daa0 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
1dab0 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
1dac0 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
1dad0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
1dae0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1daf0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1db00 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1db10 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1db20 3e 6e 4f 42 53 61 74 3e 30 29 0a 20 20 20 20 20  >nOBSat>0).     
1db30 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
1db40 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
1db50 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1db60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
1db70 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
1db80 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1db90 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
1dba0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
1dbb0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
1dbc0 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
1dbd0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1dbe0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1dbf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1dc00 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1dc10 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1dc20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1dc30 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1dc40 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1dc50 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1dc60 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1dc70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1dc80 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1dc90 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1dca0 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b   pLoop->aTerm[j+
1dcb0 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1dcc0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
1dcd0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1dce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1dcf0 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
1dd00 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
1dd10 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  op->aTerm[j++];.
1dd20 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1dd30 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1dd40 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1dd50 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
1dd60 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1dd70 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
1dd80 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
1dd90 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1dda0 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
1ddb0 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
1ddc0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
1ddd0 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
1dde0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42  .    */.    regB
1ddf0 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75  ase = codeAllEqu
1de00 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20  alityTerms(.    
1de10 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76      pParse, pLev
1de20 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64  el, pWC, notRead
1de30 79 2c 20 62 52 65 76 2c 20 6e 45 78 74 72 61 52  y, bRev, nExtraR
1de40 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20  eg, &zStartAff. 
1de50 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66     );.    zEndAf
1de60 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
1de70 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1de80 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1de90 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1dea0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
1deb0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1dec0 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
1ded0 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
1dee0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
1def0 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
1df00 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
1df10 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
1df20 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
1df30 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1df40 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
1df50 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
1df60 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
1df70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
1df80 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
1df90 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
1dfa0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
1dfb0 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
1dfc0 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
1dfd0 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  & pIdx->nColumn=
1dfe0 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
1dff0 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
1e000 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
1e010 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1e020 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
1e030 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1e040 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
1e050 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
1e060 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1e070 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
1e080 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
1e090 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
1e0a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e0b0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
1e0c0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1e0d0 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
1e0e0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1e0f0 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
1e100 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1e110 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61  WO_GE );.    sta
1e120 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1e130 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1e140 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1e150 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1e160 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1e170 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1e180 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1e190 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1e1a0 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1e1b0 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1e1c0 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1e1d0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1e1e0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1e1f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1e200 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1e210 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1e220 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1e230 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1e240 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1e250 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1e260 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1e270 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1e280 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1e290 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1e2a0 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
1e2b0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1e2c0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1e2d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e2e0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
1e2f0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
1e300 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1e310 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
1e320 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
1e330 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1e340 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1e350 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1e360 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d  zStartAff[nEq])=
1e370 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1e380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1e390 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
1e3a0 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
1e3b0 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
1e3c0 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
1e3d0 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
1e3e0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
1e3f0 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
1e400 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
1e410 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
1e420 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
1e430 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
1e440 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1e450 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1e460 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1e470 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
1e480 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
1e490 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1e4a0 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
1e4b0 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
1e4c0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
1e4d0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
1e4e0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1e4f0 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
1e500 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
1e510 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e520 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
1e530 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1e540 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1e550 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1e560 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
1e570 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
1e580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e590 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e5a0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1e5b0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1e5c0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
1e5d0 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
1e5e0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1e5f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
1e600 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1e610 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1e620 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
1e630 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
1e640 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
1e650 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
1e660 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
1e670 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
1e680 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
1e690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e6a0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
1e6b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e6c0 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
1e6d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e6e0 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
1e6f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1e700 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
1e710 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1e720 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
1e730 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1e740 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
1e750 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1e760 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1e770 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1e780 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1e790 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
1e7a0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
1e7b0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1e7c0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
1e7d0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
1e7e0 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
1e7f0 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
1e800 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
1e810 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
1e820 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1e830 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
1e840 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
1e850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e860 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1e870 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1e880 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
1e890 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e8a0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1e8b0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1e8c0 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
1e8d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e8e0 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
1e8f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e900 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1e910 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1e920 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1e930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e940 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20  f( zEndAff ){.  
1e950 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e960 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1e970 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
1e980 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
1e990 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
1e9a0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
1e9b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
1e9c0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
1e9d0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
1e9e0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
1e9f0 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
1ea00 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
1ea10 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
1ea20 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
1ea30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
1ea40 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
1ea50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  */.          zEn
1ea60 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
1ea70 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1ea80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ea90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1eaa0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1eab0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  nge(pRight, zEnd
1eac0 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
1ead0 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
1eae0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1eaf0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1eb00 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
1eb10 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
1eb20 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
1eb30 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41  se, nEq+1, zEndA
1eb40 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  ff);.      nCons
1eb50 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
1eb60 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1eb70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1eb80 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
1eb90 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
1eba0 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  662 */.    }.   
1ebb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1ebc0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72  Parse->db, zStar
1ebd0 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  tAff);.    sqlit
1ebe0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1ebf0 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a  >db, zEndAff);..
1ec00 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1ec10 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
1ec20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1ec30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1ec40 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
1ec50 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1ec60 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
1ec70 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
1ec80 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
1ec90 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70    op = aEndOp[(p
1eca0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29  RangeEnd || nEq)
1ecb0 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a   * (1 + bRev)];.
1ecc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ecd0 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
1ece0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1ecf0 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74  P_IdxGE );.    t
1ed00 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1ed10 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28  IdxLT );.    if(
1ed20 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a   op!=OP_Noop ){.
1ed30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ed40 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
1ed50 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
1ed60 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
1ed70 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
1ed80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ed90 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62  geP5(v, endEq!=b
1eda0 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d  Rev ?1:0);.    }
1edb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1edc0 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1edd0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68   constraints, ch
1ede0 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
1edf0 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ue.    ** of the
1ee00 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68   table column th
1ee10 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  at the inequalit
1ee20 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e  y contrains is n
1ee30 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  ot NULL..    ** 
1ee40 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74  If it is, jump t
1ee50 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
1ee60 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
1ee70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20  ..    */.    r1 
1ee80 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1ee90 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1eea0 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
1eeb0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1eec0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1eed0 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
1eee0 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
1eef0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ef00 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  TOP_LIMIT );.   
1ef10 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1ef20 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
1ef30 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
1ef40 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a  P_LIMIT))!=0 ){.
1ef50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ef60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1ef70 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
1ef80 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
1ef90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1efa0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1efb0 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
1efc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
1efd0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1efe0 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
1eff0 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
1f000 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
1f010 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
1f020 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1f030 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1f040 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1f050 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
1f060 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74  );.    if( !omit
1f070 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
1f080 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
1f090 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
1f0a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1f0b0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f0c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f0d0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
1f0e0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1f0f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f100 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1f110 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1f120 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1f130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f140 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
1f150 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1f160 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
1f170 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ek */.    }..   
1f180 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
1f190 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
1f1a0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1f1b0 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
1f1c0 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
1f1d0 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
1f1e0 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
1f1f0 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
1f200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f210 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1f220 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29  & WHERE_UNIQUE )
1f230 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1f240 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
1f250 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
1f260 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1f270 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
1f280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f290 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1f2a0 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
1f2b0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
1f2c0 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28  dxCur;.    if( (
1f2d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1f2e0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45   (WHERE_COLUMN_E
1f2f0 51 20 7c 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  Q | WHERE_COLUMN
1f300 5f 52 41 4e 47 45 20 7c 20 0a 20 20 20 20 20 20  _RANGE | .      
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e      WHERE_COLUMN
1f330 5f 4e 55 4c 4c 20 7c 20 57 48 45 52 45 5f 43 4f  _NULL | WHERE_CO
1f340 4c 55 4d 4e 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  LUMN_IN))==0 ){.
1f350 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
1f360 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
1f370 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
1f380 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
1f390 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1f3a0 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
1f3b0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
1f3c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f3d0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
1f3e0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
1f3f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
1f400 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
1f410 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
1f420 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
1f430 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1f440 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
1f450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1f460 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1f470 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
1f480 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
1f490 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1f4a0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
1f4b0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1f4c0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
1f4d0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
1f4e0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
1f4f0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
1f500 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
1f510 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1f520 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
1f530 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
1f540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
1f550 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
1f560 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
1f570 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
1f580 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
1f590 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
1f5a0 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
1f5b0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
1f5c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1f5d0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1f5e0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1f5f0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1f600 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
1f610 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
1f620 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
1f630 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
1f640 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
1f650 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
1f660 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
1f670 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
1f680 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
1f690 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
1f6a0 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
1f6b0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
1f6c0 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
1f6d0 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
1f6e0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
1f6f0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
1f700 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
1f710 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
1f720 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
1f730 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
1f740 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1f750 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
1f760 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
1f770 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1f780 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
1f790 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
1f7a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
1f7b0 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
1f7c0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
1f7d0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
1f7e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
1f7f0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
1f800 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
1f810 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
1f820 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
1f830 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
1f840 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
1f850 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
1f860 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
1f870 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
1f880 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1f890 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f8b0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
1f8c0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
1f8d0 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
1f8e0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
1f8f0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
1f900 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
1f910 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f920 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
1f950 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
1f960 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f970 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
1f980 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
1f990 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
1f9a0 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
1f9b0 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
1f9c0 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
1f9d0 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
1f9e0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
1f9f0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
1fa00 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
1fa10 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
1fa20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
1fa30 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
1fa40 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1fa50 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
1fa60 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
1fa70 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
1fa80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fa90 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
1faa0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
1fab0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
1fac0 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
1fad0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
1fae0 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
1faf0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
1fb00 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
1fb10 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1fb20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1fb30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1fb40 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1fb50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1fb60 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1fb90 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1fba0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1fbb0 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1fbe0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1fbf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1fc00 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1fc10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1fc20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1fc30 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1fc40 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1fc70 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1fc80 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1fc90 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1fca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fcb0 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1fcc0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1fcd0 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1fce0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fd00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1fd10 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
1fd20 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
1fd40 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
1fd50 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20  ression */.   . 
1fd60 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1fd70 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  ->aTerm[0];.    
1fd80 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1fd90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fda0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fdb0 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20   & WO_OR );.    
1fdc0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
1fdd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
1fde0 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
1fdf0 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
1fe00 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
1fe10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1fe20 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
1fe30 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
1fe40 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
1fe50 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
1fe60 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63  List in pOrTab c
1fe70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1fe80 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
1fe90 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1fea0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
1feb0 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
1fec0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
1fed0 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
1fee0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
1fef0 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
1ff00 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
1ff10 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ff20 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
1ff30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
1ff40 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
1ff50 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
1ff60 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
1ff70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1ff80 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
1ff90 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
1ffa0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ffb0 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
1ffc0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
1ffd0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
1ffe0 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
1fff0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
20000 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
20010 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
20020 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
20030 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  aw(pParse->db,. 
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
20060 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
20070 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
20080 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
20090 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
200a0 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
200b0 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
200c0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29  ->nAlloc = (i16)
200d0 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
200e0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
200f0 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
20100 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
20110 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
20120 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
20130 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
20140 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
20150 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
20160 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
20170 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
20180 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
20190 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
201a0 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
201b0 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
201c0 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
201d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
201e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
201f0 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
20200 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
20210 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
20220 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
20230 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
20240 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
20250 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
20260 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
20270 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
20280 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
20290 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
202a0 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
202b0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
202c0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
202d0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
202e0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
202f0 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
20300 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
20310 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
20320 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
20330 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
20340 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
20350 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
20360 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
20370 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
20380 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
20390 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
203a0 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
203b0 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
203c0 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
203d0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
203e0 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
203f0 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
20400 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
20410 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
20420 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
20430 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
20440 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
20450 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
20460 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
20470 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
20480 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
20490 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
204a0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
204b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
204c0 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
204d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
204e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
204f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
20500 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
20510 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
20520 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
20530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
20540 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
20550 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  urn);..    /* If
20560 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
20570 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20  ERE clause is z 
20580 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78  of the form:  (x
20590 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
205a0 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65  AND y.    ** The
205b0 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  n for every term
205c0 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73   xN, evaluate as
205d0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
205e0 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20  on: xN AND z.   
205f0 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65   ** That way, te
20600 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72  rms in y that ar
20610 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
20620 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20  the disjunction 
20630 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
20640 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20  icked up by the 
20650 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
20660 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
20670 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20  egin() below..  
20680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75    **.    ** Actu
20690 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78  ally, each subex
206a0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76  pression is conv
206b0 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44  erted to "xN AND
206c0 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20   w" where w is. 
206d0 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72     ** the "inter
206e0 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66  esting" terms of
206f0 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20   z - terms that 
20700 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
20710 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
20720 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
20730 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
20740 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61  N, and terms tha
20750 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20  t are usable as 
20760 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  .    ** indices.
20770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20780 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
20790 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69   also only appli
207a0 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52  es if the (x1 OR
207b0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d   x2 OR ...) term
207c0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  .    ** is not c
207d0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
207e0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
207f0 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a  EFT JOIN..    **
20800 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70   See ticket http
20810 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
20820 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39  g/src/info/f2369
20830 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20  304e4.    */.   
20840 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
20850 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
20860 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
20870 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70  iTerm=0; iTerm<p
20880 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d  WC->nTerm; iTerm
20890 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
208a0 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e  r *pExpr = pWC->
208b0 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
208c0 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
208d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
208e0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
208f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20900 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69      if( pWC->a[i
20910 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20920 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
20930 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e  RM_ORINFO) ) con
20940 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
20950 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( (pWC->a[iTerm
20960 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ].eOperator & WO
20970 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _ALL)==0 ) conti
20980 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78  nue;.        pEx
20990 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
209a0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
209b0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
209c0 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
209d0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
209e0 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70  rse->db, pAndExp
209f0 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  r, pExpr);.     
20a00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e   }.      if( pAn
20a10 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  dExpr ){.       
20a20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
20a30 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
20a40 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64   TK_AND, 0, pAnd
20a50 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
20a60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
20a70 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
20a80 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
20a90 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
20aa0 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
20ab0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
20ac0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
20ad0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
20ae0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
20af0 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
20b00 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
20b10 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
20b20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
20b30 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
20b40 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
20b50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45        Expr *pOrE
20b60 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  xpr = pOrTerm->p
20b70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
20b80 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45  ( pAndExpr && !E
20b90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20ba0 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  OrExpr, EP_FromJ
20bb0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
20bc0 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
20bd0 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
20be0 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
20bf0 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
20c00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
20c10 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
20c20 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
20c30 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
20c40 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
20c50 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
20c60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
20c70 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
20c80 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
20cb0 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  PEN_CLOSE | WHER
20cc0 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20  E_AND_ONLY |.   
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
20cf0 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
20d00 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43  NETABLE_ONLY, iC
20d10 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
20d20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
20d30 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
20d40 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
20d50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
20d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
20d70 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
20d80 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
20d90 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
20da0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
20db0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
20dc0 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
20dd0 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
20de0 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
20df0 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
20e00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
20e10 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
20e20 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
20e30 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
20e40 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20e50 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
20e60 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
20e70 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
20e80 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
20e90 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
20ea0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
20eb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
20ec0 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
20ed0 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
20f00 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
20f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20f20 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
20f30 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65  P_RowSetTest, re
20f40 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20  gRowset,.       
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20f70 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
20f80 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b  (v)+2, r, iSet);
20f90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20fb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
20fc0 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
20fd0 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
20fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20ff0 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
21000 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
21010 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
21020 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
21030 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
21040 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
21050 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
21060 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
21070 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
21080 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
21090 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
210a0 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
210b0 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
210c0 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
210d0 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
210e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
210f0 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
21100 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
21110 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
21120 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
21130 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
21140 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
21150 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
21160 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
21170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
21180 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
21190 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
211a0 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
211b0 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
211c0 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
211d0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
211e0 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
211f0 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
21200 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
21210 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
21220 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
21230 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
21240 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
21250 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
21260 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
21270 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
21280 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
21290 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
212a0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
212b0 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
212c0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
212d0 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
212e0 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
212f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
21300 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
21310 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
21320 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
21330 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
21340 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
21350 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
21360 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
21370 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
21380 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
21390 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
213a0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
213b0 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
213c0 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
213d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
213e0 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
213f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21400 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
21410 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
21420 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
21430 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
21440 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21450 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
21460 20 20 20 20 20 20 20 26 26 20 28 70 53 75 62 4c         && (pSubL
21470 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21480 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
21490 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
214a0 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
214b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
214c0 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
214d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
214e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
214f0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
21500 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
21510 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
21520 76 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  v = pLoop->u.btr
21530 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
21540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21550 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
21560 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
21570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
21580 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
21590 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
215a0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
215b0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
215c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
215d0 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
215e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
215f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21600 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
21610 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
21620 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
21630 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
21640 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
21650 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
21660 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
21670 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
21680 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
21690 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29  e->db, pAndExpr)
216a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
216b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
216c0 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
216d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
216e0 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
216f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21700 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
21710 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
21720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21730 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
21740 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
21750 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
21760 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
21770 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e  ackFree(pParse->
21780 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
21790 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
217a0 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
217b0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
217c0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
217d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
217e0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
217f0 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
21800 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73  ase 6:  There is
21810 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
21820 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
21830 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
21840 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
21850 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
21860 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
21870 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
21880 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
21890 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
218a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
218b0 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
218c0 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
218d0 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
218e0 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
218f0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==1 );.    pLeve
21900 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
21910 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
21920 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
21930 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
21940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21950 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
21960 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
21970 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
21980 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
21990 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
219a0 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e  STEP;.  }.  newN
219b0 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
219c0 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 70 57  dy & ~getMask(pW
219d0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
219e0 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  r);..  /* Insert
219f0 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
21a00 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
21a10 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
21a20 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
21a30 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
21a40 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
21a50 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
21a60 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
21a70 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39  -OF: R-49525-509
21a80 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61  35 Terms that ca
21a90 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65  nnot be satisfie
21aa0 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74  d through.  ** t
21ab0 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  he use of indice
21ac0 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74  s become tests t
21ad0 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  hat are evaluate
21ae0 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72  d against each r
21af0 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72  ow of.  ** the r
21b00 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61  elevant input ta
21b10 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
21b20 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
21b30 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
21b40 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
21b50 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
21b60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
21b70 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
21b80 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
21b90 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31   IMP: R-30575-11
21ba0 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  662 */.    testc
21bb0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
21bc0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
21bd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
21be0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
21bf0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
21c00 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
21c10 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
21c20 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
21c30 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
21c40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
21c50 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
21c60 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
21c70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
21c80 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
21c90 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
21ca0 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
21cb0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
21cc0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
21cd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21ce0 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
21cf0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
21d00 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
21d10 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
21d20 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
21d30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21d40 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
21d50 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
21d60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
21d70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
21d80 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
21d90 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
21da0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
21db0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
21dc0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
21dd0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
21de0 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d  e to test for im
21df0 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  plied constraint
21e00 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73  s based on trans
21e10 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20  itivity.  ** of 
21e20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f  the "==" operato
21e30 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  r..  **.  ** Exa
21e40 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45  mple: If the WHE
21e50 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
21e60 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61  ns "t1.a=t2.b" a
21e70 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20  nd "t2.b=123".  
21e80 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f  ** and we are co
21e90 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70  ding the t1 loop
21ea0 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70   and the t2 loop
21eb0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64   has not yet cod
21ec0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  ed,.  ** then we
21ed0 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
21ee0 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73  "t1.a=t2.b" cons
21ef0 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63  traint, but we c
21f00 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65  an code.  ** the
21f10 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31   implied "t1.a=1
21f20 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  23" constraint..
21f30 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
21f40 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
21f50 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
21f60 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
21f70 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 57 68 65  xpr *pE;.    Whe
21f80 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
21f90 20 20 45 78 70 72 20 73 45 71 3b 0a 20 20 20 20    Expr sEq;.    
21fa0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
21fb0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
21fc0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
21fd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
21fe0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
21ff0 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
22000 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
22010 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
22020 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
22030 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
22040 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
22050 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
22060 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22070 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
22080 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
22090 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
220a0 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65  Right & newNotRe
220b0 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ady)!=0 );.    p
220c0 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Alt = findTerm(p
220d0 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d  WC, iCur, pTerm-
220e0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e  >u.leftColumn, n
220f0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
22100 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IN, 0);.    if
22110 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74  ( pAlt==0 ) cont
22120 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41  inue;.    if( pA
22130 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  lt->wtFlags & (T
22140 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
22150 74 69 6e 75 65 3b 0a 20 20 20 20 56 64 62 65 4e  tinue;.    VdbeN
22160 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
22170 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65  begin transitive
22180 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a   constraint"));.
22190 20 20 20 20 73 45 71 20 3d 20 2a 70 41 6c 74 2d      sEq = *pAlt-
221a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 73 45 71 2e  >pExpr;.    sEq.
221b0 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
221c0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  t;.    sqlite3Ex
221d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
221e0 2c 20 26 73 45 71 2c 20 61 64 64 72 43 6f 6e 74  , &sEq, addrCont
221f0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
22200 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ULL);.  }..  /* 
22210 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
22220 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
22230 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
22240 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
22250 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
22260 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
22270 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
22280 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
22290 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
222a0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
222b0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
222c0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
222d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
222e0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
222f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22300 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
22310 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
22320 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
22330 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22340 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
22350 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
22360 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
22370 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
22380 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
22390 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
223a0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
223b0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
223c0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
223d0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
223e0 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33   );  /* IMP: R-3
223f0 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
22400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
22410 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
22420 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
22430 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
22440 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
22450 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
22460 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
22470 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
22480 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e  prereqAll & newN
22490 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
224a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
224b0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
224c0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
224d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
224e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
224f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
22500 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22510 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
22520 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
22530 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22540 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22550 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
22560 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
22570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
22580 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22590 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
225a0 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
225b0 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a  rn newNotReady;.
225c0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
225d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
225e0 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
225f0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
22600 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
22610 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
22620 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
22630 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53  (WhereLoop *p, S
22640 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
22650 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 32 2a  ){.  int nb = 2*
22660 28 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ((pTabList->nSrc
22670 2b 31 35 29 2f 31 36 29 3b 0a 20 20 73 74 72 75  +15)/16);.  stru
22680 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22690 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  *pItem = pTabLis
226a0 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
226b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
226c0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
226d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
226e0 66 28 22 25 63 20 25 32 64 2e 25 30 2a 6c 6c 78  f("%c %2d.%0*llx
226f0 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64  .%0*llx", p->cId
22700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22710 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20         p->iTab, 
22720 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c  nb, p->maskSelf,
22730 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b   nb, p->prereq);
22740 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
22750 72 69 6e 74 66 28 22 20 25 38 73 22 2c 0a 20 20  rintf(" %8s",.  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
22780 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
22790 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
227a0 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
227b0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
227c0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
227d0 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
227e0 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  e.pIndex ){.    
227f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
22800 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
22810 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a  .pIndex->zName;.
22820 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
22830 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70  =0 ) zName = "ip
22840 6b 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  k";.      if( st
22850 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
22860 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
22870 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
22880 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
22890 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
228a0 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
228b0 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
228c0 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
228d0 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
228e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
228f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22900 28 22 2e 25 2d 31 32 73 20 25 32 64 22 2c 20 7a  (".%-12s %2d", z
22910 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
22920 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
22930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
22940 65 62 75 67 50 72 69 6e 74 66 28 22 25 31 36 73  ebugPrintf("%16s
22950 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
22960 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
22970 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
22980 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
22990 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
229a0 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
229b0 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
229c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
229d0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
229e0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
229f0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
22a00 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
22a10 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
22a20 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
22a30 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
22a40 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
22a50 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
22a60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22a70 67 50 72 69 6e 74 66 28 22 20 25 2d 31 35 73 22  gPrintf(" %-15s"
22a80 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
22a90 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
22aa0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22ab0 6e 74 66 28 22 20 66 67 20 25 30 35 78 20 4e 20  ntf(" fg %05x N 
22ac0 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
22ad0 20 70 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 73 71   p->nTerm);.  sq
22ae0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22af0 28 22 20 63 6f 73 74 20 25 2e 32 67 2c 25 2e 32  (" cost %.2g,%.2
22b00 67 2c 25 2e 32 67 5c 6e 22 2c 0a 20 20 20 20 20  g,%.2g\n",.     
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 70 2d 3e 70 72 65 72 65 71 2c 20 70 2d 3e 72 53  p->prereq, p->rS
22b30 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  etup, p->rRun, p
22b40 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  ->nOut);.}.#endi
22b50 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  f../*.** Dealloc
22b60 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
22b70 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
22b80 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
22b90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
22ba0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
22bb0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
22bc0 6f 6f 70 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  oop *p){.  sqlit
22bd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
22be0 61 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 54 65  aTerm);.  p->aTe
22bf0 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 54 65  rm = 0;.  p->nTe
22c00 72 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 28 70  rm = 0;.  if( (p
22c10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
22c20 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
22c30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
22c40 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
22c50 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
22c60 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
22c70 29 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  );.    p->u.vtab
22c80 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
22c90 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
22ca0 53 74 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Str = 0;.  }else
22cb0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
22cc0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
22cd0 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
22ce0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
22cf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
22d00 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
22d10 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
22d20 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
22d30 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
22d40 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
22d50 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
22d60 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Index = 0;.  }.}
22d70 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
22d80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
22d90 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
22da0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
22db0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
22dc0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77  ereLoop *p){.  w
22dd0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
22de0 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , p);.  sqlite3D
22df0 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
22e00 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
22e10 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
22e20 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
22e30 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
22e40 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
22e50 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
22e60 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49    if( ALWAYS(pWI
22e70 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72  nfo) ){.    wher
22e80 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49  eClauseClear(pWI
22e90 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 77  nfo->pWC);.    w
22ea0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
22eb0 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
22ec0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
22ed0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
22ee0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
22ef0 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
22f00 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
22f10 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
22f20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22f30 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
22f40 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
22f50 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
22f60 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
22f70 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
22f80 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
22f90 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
22fa0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
22fb0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
22fc0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
22fd0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
22fe0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
22ff0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
23000 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
23010 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
23020 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
23030 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
23040 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
23050 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
23060 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
23070 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
23080 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
23090 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
230a0 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
230b0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
230c0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
230d0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
230e0 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69  Builder->pBest i
230f0 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
23100 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
23110 75 74 20 74 68 65 20 76 65 72 79 0a 2a 2a 20 62  ut the very.** b
23120 65 73 74 20 74 65 6d 70 6c 61 74 65 20 61 6e 64  est template and
23130 20 74 68 61 74 20 74 65 6d 70 6c 61 74 65 20 73   that template s
23140 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
23150 69 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  in pBuilder->pBe
23160 73 74 2e 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  st..** If pBuild
23170 65 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c  er->pBest is NUL
23180 4c 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  L then a list of
23190 20 74 68 65 20 62 65 73 74 20 74 65 6d 70 6c 61   the best templa
231a0 74 65 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  tes are stored.*
231b0 2a 20 69 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  * in pBuilder->p
231c0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a  WInfo->pLoops..*
231d0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
231e0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
231f0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
23200 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 4e  lder->pBest is N
23210 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
23220 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
23230 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
23240 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
23250 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74  late if the.** t
23260 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
23270 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
23280 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
23290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
232a0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
232b0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
232c0 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
232d0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
232e0 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
232f0 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
23300 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
23310 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
23320 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
23330 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
23340 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
23350 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
23360 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
23370 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
23380 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
23390 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
233a0 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (5)  The templa
233b0 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72  te uses more ter
233c0 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69  ms of the same i
233d0 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20  ndex but has no 
233e0 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20  additional.**   
233f0 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69        dependenci
23400 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a  es          .*/.
23410 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
23420 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
23430 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
23440 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
23450 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
23460 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
23470 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d  ev, *p, *pNext =
23480 20 30 2c 20 2a 70 54 6f 46 72 65 65 20 3d 20 30   0, *pToFree = 0
23490 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  ;.  WhereTerm **
234a0 70 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20 73 71  paTerm = 0;.  sq
234b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 75 69  lite3 *db = pBui
234c0 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 57 68 65 72  lder->db;.  Wher
234d0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
234e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
234f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
23500 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 64 65  der->pBest is de
23510 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
23520 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
23530 68 65 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 62  he single.  ** b
23540 65 73 74 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  est WhereLoop.  
23550 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2d  pBuilder->pBest-
23560 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 69 6e 64  >maskSelf==0 ind
23570 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f 0a 20  icates that no. 
23580 20 2a 2a 20 70 72 69 6f 72 20 57 68 65 72 65 4c   ** prior WhereL
23590 6f 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20 65  oops have been e
235a0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 61  valuated and tha
235b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 54  t the current pT
235c0 65 6d 70 6c 61 74 65 0a 20 20 2a 2a 20 69 73 20  emplate.  ** is 
235d0 74 68 65 72 65 66 6f 72 65 20 74 68 65 20 66 69  therefore the fi
235e0 72 73 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  rst and hence th
235f0 65 20 62 65 73 74 20 61 6e 64 20 73 68 6f 75 6c  e best and shoul
23600 64 20 62 65 20 72 65 74 61 69 6e 65 64 2e 0a 20  d be retained.. 
23610 20 2a 2f 0a 20 20 69 66 28 20 28 70 20 3d 20 70   */.  if( (p = p
23620 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 29 21  Builder->pBest)!
23630 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
23640 3e 6d 61 73 6b 53 65 6c 66 21 3d 30 20 29 7b 0a  >maskSelf!=0 ){.
23650 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75        if( p->rRu
23660 6e 2b 70 2d 3e 72 53 65 74 75 70 20 3c 20 70 54  n+p->rSetup < pT
23670 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 54  emplate->rRun+pT
23680 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
23690 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
236a0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f  whereLoopInsert_
236b0 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  noop;.      }.  
236c0 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 2b      if( p->rRun+
236d0 70 2d 3e 72 53 65 74 75 70 20 3d 3d 20 70 54 65  p->rSetup == pTe
236e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 54 65  mplate->rRun+pTe
236f0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20  mplate->rSetup. 
23700 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65 72        && p->prer
23710 65 71 20 3c 3d 20 70 54 65 6d 70 6c 61 74 65 2d  eq <= pTemplate-
23720 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  >prereq ){.     
23730 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
23740 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20  pInsert_noop;.  
23750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23760 2a 70 20 3d 20 2a 70 54 65 6d 70 6c 61 74 65 3b  *p = *pTemplate;
23770 0a 20 20 20 20 70 2d 3e 61 54 65 72 6d 20 3d 20  .    p->aTerm = 
23780 30 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  0;.    p->u.vtab
23790 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 23  .needFree = 0;.#
237a0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
237b0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
237c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
237d0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
237e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
237f0 66 28 22 69 6e 73 2d 62 65 73 74 3a 20 22 29 3b  f("ins-best: ");
23800 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
23810 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
23820 20 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c   pBuilder->pTabL
23830 69 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ist);.    }.#end
23840 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
23850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
23860 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
23870 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
23880 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65  oop to overwrite
23890 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73  , or which takes
238a0 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f  .  ** priority o
238b0 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20  ver pTemplate.. 
238c0 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76   */.  for(ppPrev
238d0 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  =&pWInfo->pLoops
238e0 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20  , p=*ppPrev; p; 
238f0 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
23900 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
23910 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
23920 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
23930 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
23940 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
23950 6f 72 74 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ortIdx ) continu
23960 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54  e;.    if( p->nT
23970 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  erm<pTemplate->n
23980 54 65 72 6d 0a 20 20 20 20 20 26 26 20 28 70 2d  Term.     && (p-
23990 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
239a0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
239b0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
239c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
239d0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
239e0 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e    && p->u.btree.
239f0 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74  pIndex==pTemplat
23a00 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
23a10 78 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65  x.     && p->pre
23a20 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  req==pTemplate->
23a30 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20  prereq.    ){.  
23a40 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
23a50 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
23a60 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73  reLoop with an s
23a70 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20  imilar one that 
23a80 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  uses.      ** mo
23a90 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
23aa0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
23ab0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
23ac0 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65  oop;.      where
23ad0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
23ae0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23af0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d     }.    if( (p-
23b00 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
23b10 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
23b20 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
23b30 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70  p->rSetup<=pTemp
23b40 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20  late->rSetup.   
23b50 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
23b60 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20  emplate->rRun.  
23b70 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c    ){.      /* Al
23b80 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 6e  ready holding an
23b90 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
23ba0 20 57 68 65 72 65 4c 6f 6f 70 2e 0a 20 20 20 20   WhereLoop..    
23bb0 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68    ** Return with
23bc0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20  out changing or 
23bd0 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  adding anything 
23be0 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68  */.      goto wh
23bf0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
23c00 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  op;.    }.    if
23c10 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
23c20 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
23c30 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
23c40 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
23c50 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
23c60 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26  e->rSetup.     &
23c70 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
23c80 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29  late->rRun.    )
23c90 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77  {.      /* Overw
23ca0 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
23cb0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
23cc0 61 20 62 65 74 74 65 72 20 6f 6e 65 20 2a 2f 0a  a better one */.
23cd0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
23ce0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
23cf0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
23d00 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 62  (db, p);.      b
23d10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
23d20 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
23d30 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
23d40 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
23d50 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
23d60 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
23d70 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
23d80 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
23d90 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
23da0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
23db0 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
23dc0 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
23dd0 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
23de0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
23df0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
23e00 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
23e10 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
23e20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23e30 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a  Printf("ins-del:
23e40 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72    ");.      wher
23e50 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42  eLoopPrint(p, pB
23e60 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74  uilder->pTabList
23e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23e80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23e90 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20  "ins-new:  ");. 
23ea0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
23eb0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
23ec0 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 29  ilder->pTabList)
23ed0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
23ee0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  f( p==0 ){.    p
23ef0 20 3d 20 70 54 6f 46 72 65 65 20 3d 20 73 71 6c   = pToFree = sql
23f00 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
23f10 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
23f20 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
23f30 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
23f40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
23f50 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
23f60 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 61  >nTerm ){.    pa
23f70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Term = sqlite3Db
23f80 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 54  MallocRaw(db, pT
23f90 65 6d 70 6c 61 74 65 2d 3e 6e 54 65 72 6d 2a 73  emplate->nTerm*s
23fa0 69 7a 65 6f 66 28 70 2d 3e 61 54 65 72 6d 5b 30  izeof(p->aTerm[0
23fb0 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 61 54  ]));.    if( paT
23fc0 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
23fd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23fe0 2c 20 70 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , pToFree);.    
23ff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24000 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
24010 0a 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70 6c 61  .  *p = *pTempla
24020 74 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  te;.  p->pNextLo
24030 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70  op = pNext;.  *p
24040 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 70 2d 3e  pPrev = p;.  p->
24050 61 54 65 72 6d 20 3d 20 70 61 54 65 72 6d 3b 0a  aTerm = paTerm;.
24060 20 20 69 66 28 20 70 2d 3e 6e 54 65 72 6d 20 29    if( p->nTerm )
24070 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  {.    memcpy(p->
24080 61 54 65 72 6d 2c 20 70 54 65 6d 70 6c 61 74 65  aTerm, pTemplate
24090 2d 3e 61 54 65 72 6d 2c 20 70 2d 3e 6e 54 65 72  ->aTerm, p->nTer
240a0 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65 72  m*sizeof(p->aTer
240b0 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  m[0]));.  }.  if
240c0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
240d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
240e0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
240f0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
24100 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
24110 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
24120 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
24130 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
24140 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
24150 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
24160 7b 0a 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d  {.    pTemplate-
24170 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
24180 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
24190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
241a0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
241b0 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61   the insert is a
241c0 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c   no-op */.whereL
241d0 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a  oopInsert_noop:.
241e0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
241f0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
24200 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
24210 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69   0x8 ){.    sqli
24220 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24230 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20  ins-noop: ");.  
24240 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
24250 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
24260 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 29 3b  lder->pTabList);
24270 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
24280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
24290 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61   .}../*.** We ha
242a0 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
242b0 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
242c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
242d0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
242e0 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
242f0 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
24300 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
24310 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
24320 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
24330 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
24340 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
24350 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
24360 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
24370 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
24380 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
24390 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
243a0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
243b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
243c0 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
243d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
243e0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
243f0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
24400 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
24410 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
24440 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 6e   pSrc */.  int n
24450 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
24460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24470 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
24480 6e 73 20 64 75 65 20 74 6f 20 49 4e 20 2a 2f 0a  ns due to IN */.
24490 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
244a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
244b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
244c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
244d0 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
244e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
24510 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
24520 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
24530 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24550 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
24560 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
24570 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
24580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24590 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
245a0 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
245b0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
245c0 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
245e0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
245f0 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 57  ERE terms */.  W
24600 68 65 72 65 4c 6f 6f 70 20 73 61 76 65 64 4c 6f  hereLoop savedLo
24610 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
24620 2a 20 53 61 76 65 64 20 6f 72 69 67 69 6e 61 6c  * Saved original
24630 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 4e 65 77   content of pNew
24640 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  [] */.  int iCol
24650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24660 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24670 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
24680 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
24690 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
246a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
246b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
246c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 52 6f  */.  tRowcnt iRo
246d0 77 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  wEst;           
246e0 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
246f0 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76  d index selectiv
24700 69 74 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ity */.  double 
24710 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
24720 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
24730 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
24740 69 7a 65 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ize */..  db = p
24750 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 70  Builder->db;.  p
24760 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
24770 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
24780 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
24790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
247a0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
247b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
247c0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
247d0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
247e0 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
247f0 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
24800 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
24810 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
24820 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
24830 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
24840 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
24850 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
24860 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
24870 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
24880 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
24890 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
248a0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
248b0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
248c0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
248d0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
248e0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
248f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
24900 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
24910 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
24920 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
24930 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
24940 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
24950 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
24960 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
24970 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66  LT|WO_LE);..  if
24980 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
24990 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43  nEq < pProbe->nC
249a0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f  olumn ){.    iCo
249b0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
249c0 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
249d0 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 69 52 6f  ee.nEq];.    iRo
249e0 77 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  wEst = pProbe->a
249f0 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e  iRowEst[pNew->u.
24a00 62 74 72 65 65 2e 6e 45 71 2b 31 5d 3b 0a 20 20  btree.nEq+1];.  
24a10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
24a20 3d 20 2d 31 3b 0a 20 20 20 20 69 52 6f 77 45 73  = -1;.    iRowEs
24a30 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 1;.  }.  pTe
24a40 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
24a50 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
24a60 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
24a70 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
24aa0 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 4c 6f  robe);.  savedLo
24ab0 6f 70 20 3d 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  op = *pNew;.  pN
24ac0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f  ew->rSetup = (do
24ad0 75 62 6c 65 29 30 3b 0a 20 20 72 4c 6f 67 53 69  uble)0;.  rLogSi
24ae0 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f  ze = estLog(pPro
24af0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29  be->aiRowEst[0])
24b00 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  ;.  for(; rc==SQ
24b10 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
24b20 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
24b30 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
24b40 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
24b50 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 1;.    pNew->w
24b60 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 4c 6f  sFlags = savedLo
24b70 6f 70 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  op.wsFlags;.    
24b80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24b90 71 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 75 2e  q = savedLoop.u.
24ba0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 70  btree.nEq;.    p
24bb0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 73 61 76  New->nTerm = sav
24bc0 65 64 4c 6f 6f 70 2e 6e 54 65 72 6d 3b 0a 20 20  edLoop.nTerm;.  
24bd0 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 54 65 72    if( pNew->nTer
24be0 6d 3e 3d 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54  m>=pBuilder->mxT
24bf0 65 72 6d 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  erm ) break; /* 
24c00 52 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 20  Repeated column 
24c10 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  in index */.    
24c20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 70 4e 65 77  pNew->aTerm[pNew
24c30 2d 3e 6e 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  ->nTerm++] = pTe
24c40 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
24c50 65 72 65 71 20 3d 20 28 73 61 76 65 64 4c 6f 6f  ereq = (savedLoo
24c60 70 2e 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  p.prereq | pTerm
24c70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
24c80 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
24c90 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24ca0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24cb0 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
24cc0 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
24cd0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
24ce0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24cf0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
24d00 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
24d10 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24d20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
24d30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
24d40 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
24d50 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45  :  Assume the SE
24d60 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
24d70 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
24d80 6e 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20 20 20  nIn = 25;.      
24d90 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
24da0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
24db0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
24dc0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
24dd0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
24de0 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
24df0 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
24e00 6e 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  n = pExpr->x.pLi
24e10 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
24e20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75   }.      pNew->u
24e30 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
24e40 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
24e50 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73 74   (double)iRowEst
24e60 20 2a 20 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b   * nInMul * nIn;
24e70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
24e80 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
24e90 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20  & (WO_EQ) ){.   
24ea0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
24eb0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
24ec0 5f 45 51 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  _EQ;.      pNew-
24ed0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
24ee0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
24ef0 20 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45   = (double)iRowE
24f00 73 74 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20  st * nInMul;.   
24f10 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
24f20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
24f30 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
24f40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
24f50 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
24f60 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65  _NULL;.      pNe
24f70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
24f80 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
24f90 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f  ut = (double)iRo
24fa0 77 45 73 74 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20  wEst * nInMul;. 
24fb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
24fc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24fd0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
24fe0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
24ff0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
25000 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
25010 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
25020 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
25030 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b  avedLoop.nOut/3;
25040 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
25050 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
25060 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
25070 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
25080 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
25090 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
250a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
250b0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
250c0 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f   savedLoop.nOut/
250d0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  3;.    }.    pNe
250e0 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69  w->rRun = rLogSi
250f0 7a 65 2a 6e 49 6e 3b 20 20 2f 2a 20 43 6f 73 74  ze*nIn;  /* Cost
25100 20 66 6f 72 20 6e 49 6e 20 62 69 6e 61 72 79 20   for nIn binary 
25110 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 20 20  searches */.    
25120 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
25130 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
25140 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 20 29  NLY|WHERE_IPK) )
25150 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  {.      pNew->rR
25160 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  un += pNew->nOut
25170 3b 20 20 2f 2a 20 55 6e 69 74 20 73 74 65 70 20  ;  /* Unit step 
25180 63 6f 73 74 20 74 6f 20 72 65 61 63 68 20 65 61  cost to reach ea
25190 63 68 20 72 6f 77 20 2a 2f 0a 20 20 20 20 7d 65  ch row */.    }e
251a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61  lse{.      /* Ea
251b0 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20  ch row involves 
251c0 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e  a step of the in
251d0 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61  dex, then a bina
251e0 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20  ry search of.   
251f0 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74     ** the main t
25200 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e  able */.      pN
25210 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 70 4e 65 77  ew->rRun += pNew
25220 2d 3e 6e 4f 75 74 2a 28 31 20 2b 20 72 4c 6f 67  ->nOut*(1 + rLog
25230 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
25240 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20   /* TBD: Adjust 
25250 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f  nOut and rRun fo
25260 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61  r STAT3 range va
25270 6c 75 65 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 54  lues */.    /* T
25280 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20  BD: Adjust nOut 
25290 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  for additional c
252a0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
252b0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
252c0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
252d0 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
252e0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
252f0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
25300 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
25310 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
25320 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
25330 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
25340 7a 4e 61 6d 65 21 3d 30 0a 20 20 20 20 29 7b 0a  zName!=0.    ){.
25350 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
25360 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
25370 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
25380 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29  obe, nInMul*nIn)
25390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
253a0 4e 65 77 20 3d 20 73 61 76 65 64 4c 6f 6f 70 3b  New = savedLoop;
253b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
253c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
253d0 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
253e0 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
253f0 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
25400 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
25410 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
25420 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
25430 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
25440 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
25450 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
25460 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
25470 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
25480 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
25490 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
254a0 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
254b0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
254c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
254d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
254e0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
254f0 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
25500 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
25510 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
25520 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
25530 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
25540 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
25550 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 69  t iCol;.  int ii
25560 3b 0a 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  ;..  if( (pOB = 
25570 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
25580 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
25590 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 49 6e 64  0;.  iCol = pInd
255a0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b  ex->aiColumn[0];
255b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
255c0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
255d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
255e0 70 72 20 3d 20 70 4f 42 2d 3e 61 5b 69 69 5d 2e  pr = pOB->a[ii].
255f0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
25600 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
25610 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
25620 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
25630 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
25640 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
25650 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  r->iColumn==iCol
25660 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
25670 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
25680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25690 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
256a0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
256b0 6a 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 74  jects a single t
256c0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
256d0 20 77 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a   were the table.
256e0 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
256f0 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
25700 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
25710 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
25720 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
25730 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
25740 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
25750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25760 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
25770 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
25780 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
25790 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
257a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
257b0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
257c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
257d0 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
257e0 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
257f0 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
25800 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
25810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25820 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
25830 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
25840 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
25850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25860 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
25870 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
25880 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
25890 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
258a0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
258b0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
258c0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
258d0 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
258e0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
258f0 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
25900 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
25910 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
25920 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25930 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
25940 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
25950 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
25960 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
25970 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
25980 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
25990 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
259a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
259b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
259c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
259d0 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
259e0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
259f0 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
25a00 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
25a30 6c 75 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  lue */.  double 
25a40 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
25a50 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
25a60 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
25a70 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
25a80 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
25a90 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
25aa0 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
25ab0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
25ac0 61 62 6c 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  able */.  .  pNe
25ad0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
25ae0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 70 42 75  ew;.  pSrc = pBu
25af0 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 2d  ilder->pTabList-
25b00 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
25b10 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
25b20 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
25b30 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
25b40 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
25b50 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
25b60 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
25b70 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
25b80 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
25b90 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
25ba0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
25bb0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
25bc0 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
25bd0 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
25be0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
25bf0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
25c00 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
25c10 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
25c20 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
25c30 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
25c40 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
25c50 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
25c60 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
25c70 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
25c80 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
25c90 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
25ca0 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
25cb0 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
25cc0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25cd0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
25ce0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
25cf0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
25d00 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
25d10 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
25d20 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
25d30 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
25d40 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
25d50 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
25d60 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
25d70 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
25d80 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
25d90 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
25da0 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
25db0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
25dc0 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
25dd0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
25de0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
25df0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
25e00 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
25e10 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
25e20 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
25e30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
25e40 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
25e50 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
25e60 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
25e70 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
25e80 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
25e90 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
25ea0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25eb0 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
25ec0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
25ed0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
25ee0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
25ef0 7a 65 20 3d 20 28 64 6f 75 62 6c 65 29 70 53 72  ze = (double)pSr
25f00 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
25f10 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
25f20 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20  stLog(rSize);.. 
25f30 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
25f40 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
25f50 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a  pBuilder->pBest.
25f60 20 20 20 26 26 20 28 70 42 75 69 6c 64 65 72 2d     && (pBuilder-
25f70 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
25f80 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
25f90 49 6e 64 65 78 29 21 3d 30 20 0a 20 20 20 26 26  Index)!=0 .   &&
25fa0 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
25fb0 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
25fc0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
25fd0 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
25fe0 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
25ff0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
26000 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
26010 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c  s */.    WhereCl
26020 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
26030 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20 57  lder->pWC;.    W
26040 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
26050 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
26060 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
26070 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
26080 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
26090 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  >a; rc==SQLITE_O
260a0 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e  K && pTerm<pWCEn
260b0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
260c0 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
260d0 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
260e0 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
260f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
26100 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
26110 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
26120 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
26130 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d       pNew->nTerm
26140 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
26150 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d 20 70  ew->aTerm[0] = p
26160 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e  Term;.        pN
26170 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 32 30 2a  ew->rSetup = 20*
26180 72 4c 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70  rLogSize*pSrc->p
26190 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
261a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
261b0 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 3b 0a 20   = (double)10;. 
261c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
261d0 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 70  n = rLogSize + p
261e0 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  New->nOut;.     
261f0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
26200 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   = WHERE_TEMP_IN
26210 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
26220 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
26230 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
26240 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
26250 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26260 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26270 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
26280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
26290 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
262a0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
262b0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
262c0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
262d0 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
262e0 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
262f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26300 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
26310 77 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  w->nTerm = 0;.  
26320 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
26330 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
26340 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65  rSetup = (double
26350 29 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  )0;.    pNew->pr
26360 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
26370 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
26380 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
26390 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
263a0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
263b0 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
263c0 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
263d0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  sor);.    if( pP
263e0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
263f0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
26400 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
26410 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
26420 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
26430 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
26440 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
26450 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
26460 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
26470 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
26480 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
26490 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 4e   rSize;.      pN
264a0 65 77 2d 3e 72 52 75 6e 20 3d 20 28 72 53 69 7a  ew->rRun = (rSiz
264b0 65 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28 33  e + rLogSize)*(3
264c0 2b 62 29 3b 20 2f 2a 20 34 78 20 70 65 6e 61 6c  +b); /* 4x penal
264d0 74 79 20 66 6f 72 20 61 20 66 75 6c 6c 2d 73 63  ty for a full-sc
264e0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  an */.      rc =
264f0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
26500 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
26510 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
26520 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
26530 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
26540 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
26550 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
26560 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 50 72  .      for(j=pPr
26570 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  obe->nColumn-1; 
26580 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
26590 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f      int x = pPro
265a0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  be->aiColumn[j];
265b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
265c0 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
265d0 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
265e0 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
265f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26600 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
26610 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
26620 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
26630 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
26640 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20  RE_INDEXED;..   
26650 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
26660 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
26670 20 20 20 69 66 28 20 28 6d 3d 3d 30 20 7c 7c 20     if( (m==0 || 
26680 62 29 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55  b) && pProbe->bU
26690 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20  nordered==0 ){. 
266a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
266b0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
266c0 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
266d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
266e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  Size;.        pN
266f0 65 77 2d 3e 72 52 75 6e 20 3d 20 28 6d 3d 3d 30  ew->rRun = (m==0
26700 29 20 3f 20 28 72 53 69 7a 65 20 2b 20 72 4c 6f  ) ? (rSize + rLo
26710 67 53 69 7a 65 29 2a 28 31 2b 62 29 20 3a 20 28  gSize)*(1+b) : (
26720 72 53 69 7a 65 2a 72 4c 6f 67 53 69 7a 65 29 3b  rSize*rLogSize);
26730 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
26740 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
26750 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
26760 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
26770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26780 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 68     }.    rc = wh
26790 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
267a0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
267b0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 31 29 3b  Src, pProbe, 1);
267c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
267d0 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
267e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
267f0 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
26800 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
26810 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
26820 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
26830 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ex ) break;.  }.
26840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26850 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
26860 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
26870 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
26880 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
26890 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
268a0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
268b0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
268c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
268d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
268e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
268f0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
26900 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
26910 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
26920 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
26930 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
26940 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
26950 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
26960 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
26970 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
26980 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
26990 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
269a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
269b0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
269c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
269d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
269e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
269f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
26a00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
26a10 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
26a20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
26a30 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
26a40 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  h */.  Table *pT
26a50 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
26a60 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
26a70 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
26a80 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
26a90 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
26aa0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
26ab0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
26ac0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
26ad0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
26ae0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
26af0 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
26b00 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78  .  int iTerm, mx
26b10 54 65 72 6d 3b 0a 20 20 69 6e 74 20 73 65 65 6e  Term;.  int seen
26b20 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
26b30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26b40 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  an IN operator i
26b50 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
26b60 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20  seenVar = 0;    
26b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26b80 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61   if a non-consta
26b90 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  nt constraint is
26ba0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
26bb0 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  Phase;          
26bc0 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f          /* 0: co
26bd0 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63  nst w/o IN, 1: c
26be0 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20  onst, 2: no IN, 
26bf0 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72   2: IN */.  Wher
26c00 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69  eLoop *pNew;.  i
26c10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26c20 4b 3b 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  K;..  pParse = p
26c30 42 75 69 6c 64 65 72 2d 3e 70 50 61 72 73 65 3b  Builder->pParse;
26c40 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
26c50 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  db;.  pWC = pBui
26c60 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
26c70 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
26c80 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 42  ew;.  pSrc = &pB
26c90 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74  uilder->pTabList
26ca0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
26cb0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
26cc0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
26cd0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26ce0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  );.  pIdxInfo = 
26cf0 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
26d00 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
26d10 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
26d20 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
26d30 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
26d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26d50 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
26d60 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
26d70 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
26d80 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
26d90 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
26da0 0a 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d  .  pNew->nTerm =
26db0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
26dc0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
26dd0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
26de0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
26df0 74 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  tUsage;..  for(i
26e00 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
26e10 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
26e20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
26e30 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
26e40 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
26e50 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
26e60 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
26e70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
26e80 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
26e90 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
26ea0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
26eb0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
26ec0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
26ed0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
26ee0 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
26ef0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
26f00 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
26f10 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
26f20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
26f30 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
26f40 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
26f50 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
26f60 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
26f70 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
26f80 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
26f90 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
26fa0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
26fb0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
26fc0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
26fd0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
26fe0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
26ff0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27000 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
27010 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
27020 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
27030 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
27040 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
27050 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
27060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27070 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
27080 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
27090 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
270a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
270b0 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 1:    /* Const
270c0 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65  ants with IN ope
270d0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
270e0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
270f0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
27100 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
27110 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
27120 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20  qRight==0);.    
27130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27140 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20       case 2:    
27150 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
27160 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20  hout IN */.     
27170 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
27180 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nVar );.        
27190 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
271a0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70  le = (pTerm->eOp
271b0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
271c0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =0;.          br
271d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66  eak;.        def
271e0 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61  ault:   /* Varia
271f0 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a  bles with IN */.
27200 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27210 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65  ( seenVar && see
27220 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
27230 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27240 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
27250 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27260 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
27270 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
27280 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
27290 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
272a0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  int);.    if( pI
272b0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
272c0 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
272d0 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
272e0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  ->idxStr);.    p
272f0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
27300 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
27310 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
27320 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
27330 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
27340 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
27350 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
27360 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 28 28 64   = 0;.    /* ((d
27370 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65  ouble)2) In case
27380 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
27390 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
273a0 2e 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66  . */.    pIdxInf
273b0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
273c0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
273d0 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b  L / ((double)2);
273e0 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
273f0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
27400 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
27410 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
27420 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
27430 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
27440 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
27450 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
27460 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
27470 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
27480 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
27490 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d  rereq = 0;.    m
274a0 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
274b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 42 75 69 6c  for(i=0; i<pBuil
274c0 64 65 72 2d 3e 6d 78 54 65 72 6d 3b 20 69 2b 2b  der->mxTerm; i++
274d0 29 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 5d  ) pNew->aTerm[i]
274e0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
274f0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
27500 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
27510 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
27520 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
27530 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
27540 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
27550 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
27560 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
27570 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
27580 3e 3d 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65  >=pBuilder->mxTe
27590 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
275a0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
275b0 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
275c0 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
275d0 3e 3d 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  >=pIdxInfo->nCon
275e0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
275f0 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
27600 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
27610 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
27620 65 77 2d 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d  ew->aTerm[iTerm]
27630 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
27640 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27650 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
27660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27670 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
27680 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
27690 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
276a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
276b0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
276c0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
276d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
276e0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
276f0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  >a[j];.        p
27700 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
27710 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27720 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
27730 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  >aTerm[iTerm] = 
27740 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
27750 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
27760 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
27770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
27780 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65  erm<16 && pUsage
27790 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d  [i].omit ) pNew-
277a0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
277b0 20 7c 3d 20 31 3c 3c 69 3b 0a 20 20 20 20 20 20   |= 1<<i;.      
277c0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
277d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
277e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
277f0 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f   if( pUsage[i].o
27800 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
27810 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
27820 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
27830 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
27840 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
27850 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
27860 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68   ** says that th
27870 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20  e equivalent EQ 
27880 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
27890 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74  t be safely omit
278a0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
278b0 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74   ** If we do att
278c0 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68  empt to use such
278d0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73   a constraint, s
278e0 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62  ome rows might b
278f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
27900 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65   repeated in the
27910 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20   output. */.    
27920 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27940 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61       /* A virtua
27950 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  l table that is 
27960 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61  constrained by a
27970 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20  n IN clause may 
27980 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  not.          **
27990 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
279a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
279b0 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
279c0 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
279d0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
279e0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
279f0 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
27a00 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
27a10 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
27a20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
27a30 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
27a40 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
27a50 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
27a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67            ** tog
27a70 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  ether.  */.     
27a80 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
27a90 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
27aa0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
27ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27ac0 69 66 28 20 69 3e 3d 70 49 64 78 49 6e 66 6f 2d  if( i>=pIdxInfo-
27ad0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  >nConstraint ){.
27ae0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72        pNew->nTer
27af0 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
27b00 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
27b10 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
27b20 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
27b30 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
27b40 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
27b50 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
27b60 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
27b70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
27b80 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
27b90 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
27ba0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
27bb0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
27bc0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
27bd0 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 70 49  rdered = (u8)(pI
27be0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
27bf0 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  !=0);.      pNew
27c00 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62  ->rSetup = (doub
27c10 6c 65 29 30 3b 0a 20 20 20 20 20 20 70 4e 65 77  le)0;.      pNew
27c20 2d 3e 72 52 75 6e 20 3d 20 70 49 64 78 49 6e 66  ->rRun = pIdxInf
27c30 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
27c40 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
27c50 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 35 3b  ut = (double)25;
27c60 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
27c70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
27c80 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
27c90 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
27ca0 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
27cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27cc0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
27cd0 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
27ce0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
27cf0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
27d00 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
27d10 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
27d20 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
27d30 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
27d40 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
27d50 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
27d60 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
27d70 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
27d80 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
27d90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
27da0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
27db0 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
27dc0 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
27dd0 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
27de0 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
27df0 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
27e00 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
27e10 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
27e20 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
27e30 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
27e40 72 61 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  ra){.  WhereClau
27e50 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
27e60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
27e70 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
27e80 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
27e90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27ea0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
27eb0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
27ec0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
27ed0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
27ee0 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73 74   WhereLoop sBest
27ef0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
27f00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
27f10 20 20 0a 0a 20 20 70 57 43 20 3d 20 70 42 75 69    ..  pWC = pBui
27f20 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
27f30 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73   pWC->wctrlFlags
27f40 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
27f50 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
27f60 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
27f70 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
27f80 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
27f90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
27fa0 20 70 49 74 65 6d 20 3d 20 70 42 75 69 6c 64 65   pItem = pBuilde
27fb0 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  r->pTabList->a +
27fc0 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
27fd0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
27fe0 72 73 6f 72 3b 0a 20 20 73 53 75 62 42 75 69 6c  rsor;.  sSubBuil
27ff0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
28000 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
28010 72 42 79 20 3d 20 30 3b 0a 20 20 73 53 75 62 42  rBy = 0;.  sSubB
28020 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73 42  uild.pBest = &sB
28030 65 73 74 3b 0a 20 20 74 65 6d 70 57 43 2e 70 50  est;.  tempWC.pP
28040 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
28050 73 65 3b 0a 20 20 74 65 6d 70 57 43 2e 70 4d 61  se;.  tempWC.pMa
28060 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
28070 73 6b 53 65 74 3b 0a 20 20 74 65 6d 70 57 43 2e  skSet;.  tempWC.
28080 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
28090 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
280a0 4e 44 3b 0a 20 20 74 65 6d 70 57 43 2e 77 63 74  ND;.  tempWC.wct
280b0 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 74  rlFlags = 0;.  t
280c0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
280d0 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
280e0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
280f0 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
28100 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
28110 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
28120 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
28130 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
28140 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
28150 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
28160 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
28170 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
28180 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
28190 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
281a0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
281b0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
281c0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
281d0 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
281e0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
281f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
28200 54 65 72 6d 3b 0a 20 20 20 20 20 20 64 6f 75 62  Term;.      doub
28210 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20  le rTotal = 0;. 
28220 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77       double nRow
28230 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d   = 0;.      Bitm
28240 61 73 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78  ask prereq = mEx
28250 74 72 61 3b 0a 0a 0a 20 20 20 20 20 20 66 6f 72  tra;...      for
28260 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
28270 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
28280 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
28290 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
282a0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
282b0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
282c0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
282d0 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
282e0 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
282f0 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
28300 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
28310 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
28320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
28330 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
28340 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
28350 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
28360 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
28370 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
28380 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
28390 0a 20 20 20 20 20 20 20 20 73 42 65 73 74 2e 6d  .        sBest.m
283a0 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20 20 20  askSelf = 0;.   
283b0 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
283c0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
283d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
283e0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
283f0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
28400 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
28410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28420 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
28430 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
28440 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
28450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28460 20 20 69 66 28 20 73 42 65 73 74 2e 6d 61 73 6b    if( sBest.mask
28470 53 65 6c 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Self==0 ) break;
28480 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28490 20 73 42 65 73 74 2e 72 53 65 74 75 70 3d 3d 28   sBest.rSetup==(
284a0 64 6f 75 62 6c 65 29 30 20 29 3b 0a 20 20 20 20  double)0 );.    
284b0 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42      rTotal += sB
284c0 65 73 74 2e 72 52 75 6e 3b 0a 20 20 20 20 20 20  est.rRun;.      
284d0 20 20 6e 52 6f 77 20 2b 3d 20 73 42 65 73 74 2e    nRow += sBest.
284e0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 72  nOut;.        pr
284f0 65 72 65 71 20 7c 3d 20 73 42 65 73 74 2e 70 72  ereq |= sBest.pr
28500 65 72 65 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ereq;.      }.  
28510 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
28520 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
28530 3e 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  >aTerm[0] = pTer
28540 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
28550 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
28560 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
28570 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64  New->rSetup = (d
28580 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20 20 20 70  ouble)0;.      p
28590 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 54 6f 74  New->rRun = rTot
285a0 61 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  al;.      pNew->
285b0 6e 4f 75 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nOut = nRow;.   
285c0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
285d0 3d 20 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  = prereq;.      
285e0 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
285f0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
28600 3e 75 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >u));.      rc =
28610 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
28620 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
28630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28650 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
28660 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
28670 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
28680 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
28690 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
286a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
286b0 6c 64 65 72 29 7b 0a 20 20 42 69 74 6d 61 73 6b  lder){.  Bitmask
286c0 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
286d0 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
286e0 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
286f0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
28700 73 74 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  st = pBuilder->p
28710 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
28720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28730 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
28740 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
28750 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 71 6c  lder->pWC;.  sql
28760 69 74 65 33 20 2a 64 62 20 3d 20 70 42 75 69 6c  ite3 *db = pBuil
28770 64 65 72 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  der->db;.  int n
28780 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c 64  TabList = pBuild
28790 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  er->pWInfo->nLev
287a0 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
287b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
287c0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
287d0 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
287e0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
287f0 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
28800 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 42 75  o right */.  pBu
28810 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d 20 70 4e  ilder->pNew = pN
28820 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
28830 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
28840 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
28850 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
28860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28870 4f 4d 45 4d 3b 0a 20 20 70 42 75 69 6c 64 65 72  OMEM;.  pBuilder
28880 2d 3e 6d 78 54 65 72 6d 20 3d 20 70 57 43 2d 3e  ->mxTerm = pWC->
28890 6e 54 65 72 6d 2b 31 3b 0a 20 20 77 68 69 6c 65  nTerm+1;.  while
288a0 28 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 29 7b  ( pWC->pOuter ){
288b0 0a 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e  .    pWC = pWC->
288c0 70 4f 75 74 65 72 3b 0a 20 20 20 20 70 42 75 69  pOuter;.    pBui
288d0 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20 2b 3d 20  lder->mxTerm += 
288e0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 7d 0a  pWC->nTerm;.  }.
288f0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
28900 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->pWC;.  pNew->a
28910 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Term = sqlite3Db
28920 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 70 42  MallocZero(db,pB
28930 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 2a 73  uilder->mxTerm*s
28940 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 54 65 72  izeof(pNew->aTer
28950 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 4e  m[0]));.  if( pN
28960 65 77 2d 3e 61 54 65 72 6d 3d 3d 30 20 29 7b 0a  ew->aTerm==0 ){.
28970 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28980 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
28990 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 5f  whereLoopAddAll_
289a0 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  end;.  }.  for(i
289b0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
289c0 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
289d0 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
289e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
289f0 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
28a00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
28a10 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 70  Self = getMask(p
28a20 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 49  WC->pMaskSet, pI
28a30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
28a40 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 6a     if( (pItem->j
28a50 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
28a60 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
28a70 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61   ){.      mExtra
28a80 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
28a90 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
28aa0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
28ab0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
28ac0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
28ad0 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  l(pBuilder, mExt
28ae0 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ra);.    }else{.
28af0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28b00 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
28b10 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
28b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28b40 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
28b50 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
28b60 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
28b70 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
28b80 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
28b90 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
28ba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28bb0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 77 68 65 72   break;.  }.wher
28bc0 65 4c 6f 6f 70 41 64 64 41 6c 6c 5f 65 6e 64 3a  eLoopAddAll_end:
28bd0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  .  whereLoopDele
28be0 74 65 28 64 62 2c 20 70 42 75 69 6c 64 65 72 2d  te(db, pBuilder-
28bf0 3e 70 4e 65 77 29 3b 0a 20 20 70 42 75 69 6c 64  >pNew);.  pBuild
28c00 65 72 2d 3e 70 4e 65 77 20 3d 20 30 3b 0a 20 20  er->pNew = 0;.  
28c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28c20 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
28c30 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
28c40 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
28c50 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
28c60 70 20 6f 66 20 74 68 65 20 34 74 68 0a 2a 2a 20  p of the 4th.** 
28c70 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
28c80 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
28c90 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
28ca0 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
28cb0 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
28cc0 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
28cd0 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
28ce0 75 72 63 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  urce operation. 
28cf0 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20   Return:.** .** 
28d00 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20     0:  ORDER BY 
28d10 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
28d20 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69  .  Sorting requi
28d30 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52  red.**    1:  OR
28d40 44 45 52 20 42 59 20 69 73 20 73 61 74 69 73 66  DER BY is satisf
28d50 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73  ied.      Omit s
28d60 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20  orting.**   -1: 
28d70 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73   Unknown at this
28d80 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74   time.**.*/.stat
28d90 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
28da0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
28db0 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
28dc0 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
28dd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
28de0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
28df0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
28e00 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
28e10 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ck */.  int nLoo
28e20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
28e30 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
28e40 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
28e50 6f 70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 73  op[] */.  int is
28e60 4c 61 73 74 4c 6f 6f 70 2c 20 20 20 20 20 20 20  LastLoop,       
28e70 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 65 20  /* True for the 
28e80 76 65 72 79 20 6c 61 73 74 20 6c 6f 6f 70 20 2a  very last loop *
28e90 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
28ea0 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64  Last,     /* Add
28eb0 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
28ec0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50  to the end of pP
28ed0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
28ee0 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d    Bitmask *pRevM
28ef0 61 73 6b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ask     /* Mask 
28f00 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
28f10 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
28f20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
28f30 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
28f40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
28f50 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
28f60 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
28f70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
28f80 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
28f90 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
28fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28fb0 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
28fc0 0a 20 20 75 38 20 69 73 4f 6e 65 52 6f 77 3b 20  .  u8 isOneRow; 
28fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
28fe0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ent WhereLoop is
28ff0 20 61 20 6f 6e 65 2d 72 6f 77 20 6c 6f 6f 70 20   a one-row loop 
29000 2a 2f 0a 20 20 75 38 20 72 65 71 75 69 72 65 4f  */.  u8 requireO
29010 6e 65 52 6f 77 20 3d 20 30 3b 20 2f 2a 20 41 6c  neRow = 0; /* Al
29020 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f  l subsequent loo
29030 70 73 20 6d 75 73 74 20 62 65 20 6f 6e 65 2d 72  ps must be one-r
29040 6f 77 20 2a 2f 0a 20 20 75 38 20 69 73 55 6e 69  ow */.  u8 isUni
29050 71 75 65 49 64 78 3b 20 20 20 20 20 20 20 2f 2a  queIdx;       /*
29060 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
29070 6f 70 20 75 73 65 73 20 61 20 75 6e 69 71 75 65  op uses a unique
29080 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
29090 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 75 31 36 20 6e  nColumn;.  u16 n
290a0 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 69  OrderBy;.  int i
290b0 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 55 73 65 64  , j;.  int nUsed
290c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 75 72   = 0;.  int iCur
290d0 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  ;.  int iColumn;
290e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
290f0 6f 6f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  oop;.  ExprList 
29100 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e  *pOrderBy = pWIn
29110 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  fo->pOrderBy;.  
29120 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 0a 20  Expr *pOBExpr;. 
29130 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
29140 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
29150 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
29160 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
29170 2d 3e 64 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20  ->db;.  Bitmask 
29180 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20  revMask = 0;..  
29190 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
291a0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
291b0 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 61 6c 6c  "one-row" if all
291c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
291d0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
291e0 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
291f0 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
29200 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
29210 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
29220 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
29230 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 6e 65  e.  **.  ** Gene
29240 72 61 6c 20 72 75 6c 65 73 3a 20 20 28 6e 6f 74  ral rules:  (not
29250 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 21 29 0a   an algorithm!).
29260 20 20 2a 2a 0a 20 20 2a 2a 20 20 28 31 29 20 49    **.  **  (1) I
29270 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 57 68  f the current Wh
29280 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72  ereLoop is one-r
29290 6f 77 2c 20 74 68 65 6e 20 6d 61 74 63 68 20 6f  ow, then match o
292a0 76 65 72 20 61 6e 79 20 61 6e 64 20 61 6c 6c 0a  ver any and all.
292b0 20 20 2a 2a 20 20 20 20 20 20 4f 52 44 45 52 20    **      ORDER 
292c0 42 59 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  BY terms for the
292d0 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
292e0 6f 70 20 61 6e 64 20 70 72 6f 63 65 65 64 20 74  op and proceed t
292f0 6f 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  o the next.  ** 
29300 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 2e 0a       WhereLoop..
29310 20 20 2a 2a 0a 20 20 2a 2a 20 20 28 32 29 20 49    **.  **  (2) I
29320 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 57 68  f the current Wh
29330 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 6f  ereLoop is not o
29340 6e 65 2d 72 6f 77 2c 20 74 68 65 6e 20 61 6c 6c  ne-row, then all
29350 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 2a 2a   subsequent.  **
29360 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 73        WhereLoops
29370 20 6d 75 73 74 20 62 65 20 6f 6e 65 2d 72 6f 77   must be one-row
29380 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 28 33 29  ..  **.  **  (3)
29390 20 4f 70 74 69 6f 6e 61 6c 6c 79 20 6d 61 74 63   Optionally matc
293a0 68 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  h any ORDER BY t
293b0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
293c0 20 66 69 72 73 74 20 6e 45 71 20 63 6f 6c 75 6d   first nEq colum
293d0 6e 73 0a 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  ns.  **      of 
293e0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
293f0 20 20 2a 2a 20 20 28 34 29 20 49 6e 64 65 78 20    **  (4) Index 
29400 63 6f 6c 75 6d 6e 73 20 70 61 73 74 20 6e 45 71  columns past nEq
29410 20 6d 75 73 74 20 6d 61 74 63 68 20 4f 52 44 45   must match ORDE
29420 52 20 42 59 20 74 65 72 6d 73 20 6f 6e 65 2d 66  R BY terms one-f
29430 6f 72 2d 6f 6e 65 2e 0a 20 20 2a 2a 0a 20 20 2a  or-one..  **.  *
29440 2a 20 20 28 35 29 20 49 66 20 61 6c 6c 20 63 6f  *  (5) If all co
29450 6c 75 6d 6e 73 20 6f 66 20 61 20 55 4e 49 51 55  lumns of a UNIQU
29460 45 20 69 6e 64 65 78 20 68 61 76 65 20 62 65 65  E index have bee
29470 6e 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  n matched agains
29480 74 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  t ORDER BY.  ** 
29490 20 20 20 20 20 74 65 72 6d 73 2c 20 74 68 65 6e       terms, then
294a0 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20   any subsequent 
294b0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 4f  entries in the O
294c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
294d0 67 61 69 6e 73 74 20 74 68 65 0a 20 20 2a 2a 20  gainst the.  ** 
294e0 20 20 20 20 20 73 61 6d 65 20 74 61 62 6c 65 20       same table 
294f0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
29500 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
29510 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a  pOrderBy!=0 );..
29520 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79    /* Sortability
29530 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
29540 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  es is determined
29550 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
29560 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f  ex method.  ** o
29570 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
29580 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  ble itself */.  
29590 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61  if( pLast->wsFla
295a0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
295b0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 61  ALTABLE ){.    a
295c0 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3d 3d 30 20  ssert( nLoop==0 
295d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  );.    return pL
295e0 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  ast->u.vtab.isOr
295f0 64 65 72 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dered;.  }..  /*
29600 20 53 6f 72 74 69 6e 67 20 69 73 20 61 6c 77 61   Sorting is alwa
29610 79 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  ys required if a
29620 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ny term of the O
29630 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 61  RDER BY is not a
29640 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65   .  ** column re
29650 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 6e 4f 72  ference */.  nOr
29660 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
29670 2d 3e 6e 45 78 70 72 3b 0a 23 69 66 20 30 0a 20  ->nExpr;.#if 0. 
29680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
29690 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
296a0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
296b0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
296c0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
296d0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
296e0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
296f0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
29700 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
29710 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c    .  for(i=0; i<
29720 3d 6e 4c 6f 6f 70 20 26 26 20 6e 55 73 65 64 3c  =nLoop && nUsed<
29730 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
29740 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 3c 6e 4c      pLoop = i<nL
29750 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
29760 6f 70 5b 69 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  op[i] : pLast;. 
29770 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
29780 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
29790 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
297a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 4f 6e 65  ==0 );.    isOne
297b0 52 6f 77 20 3d 20 69 73 55 6e 69 71 75 65 49 64  Row = isUniqueId
297c0 78 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  x = 1;.    if( p
297d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
297e0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
297f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
29800 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
29810 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 29 20 69  OLUMN_IN)!=0 ) i
29820 73 4f 6e 65 52 6f 77 20 3d 20 30 3b 0a 20 20 20  sOneRow = 0;.   
29830 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
29840 62 74 72 65 65 2e 6e 45 71 21 3d 31 20 29 20 69  btree.nEq!=1 ) i
29850 73 4f 6e 65 52 6f 77 20 3d 20 30 3b 0a 20 20 20  sOneRow = 0;.   
29860 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
29870 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30       nColumn = 0
29880 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
29890 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
298a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
298b0 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
298c0 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
298d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
298e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
298f0 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
29900 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69  nColumn;.      i
29910 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  f( pIndex->onErr
29920 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or==OE_None ){. 
29930 20 20 20 20 20 20 20 69 73 4f 6e 65 52 6f 77 20         isOneRow 
29940 3d 20 69 73 55 6e 69 71 75 65 49 64 78 20 3d 20  = isUniqueIdx = 
29950 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
29960 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
29970 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
29980 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
29990 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 20 20 20  MN_RANGE.       
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 57 48 45              |WHE
299c0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29  RE_COLUMN_NULL))
299d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
299e0 73 4f 6e 65 52 6f 77 20 3d 20 30 3b 0a 20 20 20  sOneRow = 0;.   
299f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
29a00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
29a10 3c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  < pIndex->nColum
29a20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 4f  n ){.        isO
29a30 6e 65 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20  neRow = 0;.     
29a40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29a50 20 21 69 73 4f 6e 65 52 6f 77 20 26 26 20 72 65   !isOneRow && re
29a60 71 75 69 72 65 4f 6e 65 52 6f 77 20 29 20 72 65  quireOneRow ) re
29a70 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 71 75  turn 0;.    requ
29a80 69 72 65 4f 6e 65 52 6f 77 20 3d 20 21 69 73 4f  ireOneRow = !isO
29a90 6e 65 52 6f 77 3b 0a 20 20 20 20 69 43 75 72 20  neRow;.    iCur 
29aa0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
29ab0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
29ac0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  b].iCursor;.    
29ad0 6a 20 3d 20 30 3b 0a 20 20 20 20 72 65 76 53 65  j = 0;.    revSe
29ae0 74 20 3d 20 72 65 76 20 3d 20 30 3b 0a 20 20 20  t = rev = 0;.   
29af0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f   for(j=0; j<=nCo
29b00 6c 75 6d 6e 20 26 26 20 6e 55 73 65 64 3c 6e 4f  lumn && nUsed<nO
29b10 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 6e 55 73  rderBy; j++, nUs
29b20 65 64 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  ed++){.      int
29b30 20 73 6b 69 70 61 62 6c 65 3b 0a 20 20 20 20 20   skipable;.     
29b40 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
29b50 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29b60 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 55  e(pOrderBy->a[nU
29b70 73 65 64 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  sed].pExpr);.   
29b80 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
29b90 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
29ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
29bb0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
29bc0 62 6c 65 21 3d 69 43 75 72 20 29 20 62 72 65 61  ble!=iCur ) brea
29bd0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  k;.      if( isO
29be0 6e 65 52 6f 77 20 29 7b 20 6a 2d 2d 3b 20 63 6f  neRow ){ j--; co
29bf0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
29c00 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b  if( j<nColumn ){
29c10 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d  .        /* Norm
29c20 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  al index columns
29c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   */.        iCol
29c40 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
29c50 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
29c60 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
29c70 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
29c80 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ];.        if( i
29c90 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
29ca0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
29cb0 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
29cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29cd0 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20     /* The ROWID 
29ce0 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e  column at the en
29cf0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 43 6f  d */.        iCo
29d00 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
29d10 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
29d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 6b 69       }.      ski
29d30 70 61 62 6c 65 20 3d 20 6a 3c 70 4c 6f 6f 70 2d  pable = j<pLoop-
29d40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26 26 20  >u.btree.nEq && 
29d50 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d 2d  pLoop->aTerm[j]-
29d60 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49  >eOperator!=WO_I
29d70 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  N;.      if( pOB
29d80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
29d90 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
29da0 20 20 69 66 28 20 73 6b 69 70 61 62 6c 65 20 29    if( skipable )
29db0 7b 20 6e 55 73 65 64 2d 2d 3b 20 63 6f 6e 74 69  { nUsed--; conti
29dc0 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 20 20 72  nue; }.        r
29dd0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
29de0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
29df0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
29e00 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
29e10 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
29e20 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
29e30 65 72 42 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e 70  erBy->a[nUsed].p
29e40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
29e50 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
29e60 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
29e70 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
29e80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
29e90 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
29ea0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
29eb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
29ec0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
29ed0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29ee0 20 69 66 28 20 21 73 6b 69 70 61 62 6c 65 20 29   if( !skipable )
29ef0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
29f00 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
29f10 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
29f20 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
29f30 61 5b 6e 55 73 65 64 5d 2e 73 6f 72 74 4f 72 64  a[nUsed].sortOrd
29f40 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  er ) return 0;. 
29f50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29f60 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
29f70 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
29f80 3e 61 5b 6e 55 73 65 64 5d 2e 73 6f 72 74 4f 72  >a[nUsed].sortOr
29f90 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  der;.          r
29fa0 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
29fb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29fc0 20 20 20 69 66 28 20 6a 3e 3d 6e 43 6f 6c 75 6d     if( j>=nColum
29fd0 6e 2d 31 20 26 26 20 69 73 55 6e 69 71 75 65 49  n-1 && isUniqueI
29fe0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  dx ){.        if
29ff0 28 20 69 73 4c 61 73 74 4c 6f 6f 70 20 26 26 20  ( isLastLoop && 
2a000 69 3d 3d 6e 4c 6f 6f 70 20 29 20 62 72 65 61 6b  i==nLoop ) break
2a010 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
2a020 20 20 20 20 20 20 20 69 73 4f 6e 65 52 6f 77 20         isOneRow 
2a030 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2a040 20 7d 0a 20 20 20 20 69 66 28 20 72 65 76 20 29   }.    if( rev )
2a050 20 72 65 76 4d 61 73 6b 20 7c 3d 20 28 28 42 69   revMask |= ((Bi
2a060 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  tmask)1)<<i;.  }
2a070 0a 20 20 69 66 28 20 69 73 4c 61 73 74 4c 6f 6f  .  if( isLastLoo
2a080 70 20 7c 7c 20 6e 55 73 65 64 3d 3d 6e 4f 72 64  p || nUsed==nOrd
2a090 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 52 65  erBy ){.    *pRe
2a0a0 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
2a0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2a0c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2a0d0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
2a0e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
2a0f0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
2a100 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
2a110 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
2a120 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
2a130 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
2a140 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
2a150 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
2a160 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
2a170 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
2a180 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
2a190 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
2a1a0 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
2a1b0 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
2a1c0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
2a1d0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
2a1e0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
2a1f0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2a200 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
2a210 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
2a220 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
2a230 62 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f  bjects on pWInfo
2a240 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
2a250 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
2a260 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
2a270 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
2a280 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
2a290 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
2a2a0 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
2a2b0 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
2a2c0 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
2a2d0 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
2a2e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2a2f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2a300 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
2a310 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
2a320 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
2a330 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
2a340 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2a350 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
2a360 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 64 6f 75  nfo *pWInfo, dou
2a370 62 6c 65 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  ble nRowEst){.  
2a380 63 6f 6e 73 74 20 69 6e 74 20 6d 78 43 68 6f 69  const int mxChoi
2a390 63 65 20 3d 20 31 30 3b 20 20 2f 2a 20 4d 61 78  ce = 10;  /* Max
2a3a0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
2a3b0 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
2a3c0 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
2a3d0 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
2a3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a3f0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
2a400 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 73 71 6c  he join */.  sql
2a410 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2a420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2a430 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a440 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
2a450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a460 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2a470 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
2a480 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
2a490 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
2a4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a4b0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2a4c0 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
2a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a4e0 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2a4f0 20 20 64 6f 75 62 6c 65 20 6d 78 43 6f 73 74 3b    double mxCost;
2a500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2a510 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
2a520 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
2a530 0a 20 20 64 6f 75 62 6c 65 20 72 53 6f 72 74 43  .  double rSortC
2a540 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
2a550 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72  Cost to do a sor
2a560 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  t */.  int nTo, 
2a570 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
2a580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2a590 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
2a5a0 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
2a5b0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2a5c0 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
2a5d0 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
2a5e0 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
2a5f0 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
2a600 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
2a610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2a620 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
2a630 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
2a640 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
2a650 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
2a660 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
2a670 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
2a680 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2a690 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
2a6a0 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
2a6b0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2a6c0 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
2a6d0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
2a6e0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a6f0 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
2a700 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
2a710 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2a720 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
2a730 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
2a740 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
2a750 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
2a760 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  y */.  char *pSp
2a770 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2a780 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
2a790 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
2a7a0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  s routine */..  
2a7b0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2a7c0 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
2a7d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2a7e0 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  l;.  assert( nLo
2a7f0 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
2a800 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 23 69  List->nSrc );.#i
2a810 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2a820 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2a830 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
2a840 3d 32 20 29 20 73 71 6c 69 74 65 33 44 65 62 75  =2 ) sqlite3Debu
2a850 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 62 65  gPrintf("---- be
2a860 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 3b 0a  gin solver\n");.
2a870 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c  #endif..  /* All
2a880 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2a890 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
2a8a0 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
2a8b0 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
2a8c0 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
2a8d0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
2a8e0 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
2a8f0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
2a900 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
2a910 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
2a920 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
2a930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a940 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
2a950 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
2a960 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
2a970 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
2a980 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
2a990 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
2a9a0 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
2a9b0 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
2a9c0 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
2a9d0 61 54 6f 3b 20 69 69 3c 6d 78 43 68 6f 69 63 65  aTo; ii<mxChoice
2a9e0 2a 32 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  *2; ii++, pFrom+
2a9f0 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
2aa00 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
2aa10 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
2aa20 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
2aa30 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
2aa40 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
2aa50 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
2aa60 6f 6f 70 73 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  oops */.  aFrom[
2aa70 30 5d 2e 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c  0].nRow = (doubl
2aa80 65 29 31 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  e)1;.  nFrom = 1
2aa90 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
2aaa0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
2aab0 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
2aac0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
2aad0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2aae0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2aaf0 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
2ab00 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
2ab10 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73  ng */.  rSortCos
2ab20 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  t = (double)0;. 
2ab30 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2ab40 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
2ab50 45 73 74 3c 3d 30 2e 30 20 29 7b 0a 20 20 20 20  Est<=0.0 ){.    
2ab60 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
2ab70 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
2ab80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d  else{.    /* Com
2ab90 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65  pute an estimate
2aba0 20 6f 6e 20 74 68 65 20 63 6f 73 74 20 74 6f 20   on the cost to 
2abb0 73 6f 72 74 20 74 68 65 20 65 6e 74 69 72 65 20  sort the entire 
2abc0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
2abd0 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
2abe0 6f 77 45 73 74 2a 65 73 74 4c 6f 67 28 6e 52 6f  owEst*estLog(nRo
2abf0 77 45 73 74 29 3b 0a 23 69 66 64 65 66 20 57 48  wEst);.#ifdef WH
2ac00 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2ac10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ac20 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
2ac30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2ac40 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
2ac50 73 6f 72 74 20 63 6f 73 74 3d 25 2d 37 2e 32 67  sort cost=%-7.2g
2ac60 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  \n", rSortCost);
2ac70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2ac80 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
2ac90 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
2aca0 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
2acb0 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
2acc0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
2acd0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
2ace0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
2acf0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
2ad00 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
2ad10 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
2ad20 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
2ad30 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
2ad40 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
2ad50 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
2ad60 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
2ad70 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
2ad80 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
2ad90 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
2ada0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
2adb0 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
2adc0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
2add0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
2ade0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
2adf0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
2ae00 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
2ae10 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
2ae20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
2ae30 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
2ae40 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2ae50 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
2ae60 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
2ae70 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
2ae80 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
2ae90 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
2aea0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2aeb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2aec0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
2aed0 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
2aee0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2aef0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2af00 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2af10 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
2af20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
2af30 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
2af40 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
2af50 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
2af60 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 70         rCost = p
2af70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 20 2b 20  WLoop->rSetup + 
2af80 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 2a 70 46 72  pWLoop->rRun*pFr
2af90 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 46 72 6f 6d  om->nRow + pFrom
2afa0 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
2afb0 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
2afc0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
2afd0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2afe0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 72         if( !isOr
2aff0 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20  deredValid ){.  
2b000 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
2b010 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2b020 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
2b030 2c 20 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  , pFrom, iLoop, 
2b040 69 4c 6f 6f 70 3d 3d 6e 4c 6f 6f 70 2d 31 2c 0a  iLoop==nLoop-1,.
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 20 20 20 20 20 20 20 20 20 70 57 4c 6f              pWLo
2b080 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b  op, &revMask) ){
2b090 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
2b0a0 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70  e 1:  /* Yes.  p
2b0b0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73  From+pWLoop does
2b0c0 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
2b0d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2b0f0 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  Ordered = 1;.   
2b100 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2b110 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2b130 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2b140 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20  case 0:  /* No. 
2b150 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69   pFrom+pWLoop wi
2b160 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70  ll require a sep
2b170 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20  arate sort */.  
2b180 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2b190 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  dered = 0;.     
2b1a0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2b1b0 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
2b1c0 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74             rCost
2b1d0 20 2b 3d 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20   += rSortCost;. 
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2b1f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2b200 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e  default: /* Cann
2b210 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72  ot tell yet.  Tr
2b220 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e  y again on the n
2b230 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
2b240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2b250 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2b260 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b270 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2b280 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
2b290 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
2b2a0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
2b2b0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
2b2c0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
2b2d0 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
2b2e0 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2b2f0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2b300 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
2b310 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  ew && pTo->isOrd
2b320 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
2b330 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
2b340 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b370 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
2b380 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
2b390 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73  mxChoice && rCos
2b3a0 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66  t>=mxCost ){.#if
2b3b0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2b3c0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20  NABLED.         
2b3d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2b3e0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b400 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2b410 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
2b420 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63  =%-7.2g order=%c
2b430 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b440 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2b450 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2b460 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2b470 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2b480 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2b490 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2b4a0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2b4b0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2b4c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2b4d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2b4e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b4f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
2b500 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
2b510 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
2b520 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
2b530 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2b540 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
2b550 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
2b560 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
2b570 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2b580 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
2b590 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2b5b0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
2b5c0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
2b5d0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
2b5e0 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
2b5f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2b600 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d  j=nTo-1; aTo[jj]
2b610 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a  .rCost<mxCost; j
2b620 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e  j--){ assert(jj>
2b630 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  0); }.          
2b640 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
2b650 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
2b660 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2b670 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
2b680 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2b690 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2b6a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b6b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
2b6c0 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e      %s cost=%-7.
2b6d0 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  2g order=%c\n",.
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2b700 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2b710 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
2b720 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2b730 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2b740 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2b750 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2b760 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2b770 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b780 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
2b790 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29  ->rCost<=rCost )
2b7a0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
2b7b0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2b7c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2b7d0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2b7e0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2b7f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2b800 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2b810 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
2b820 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20   %s cost=%-7.2g 
2b830 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2b850 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2b860 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2b870 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
2b880 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2b890 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2b8a0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2b8b0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2b8c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b8d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
2b8e0 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e   vs %s cost=%-7.
2b8f0 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  2g order=%c\n",.
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b910 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2b920 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2b930 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2b960 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
2b970 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2b980 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2b990 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2b9b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2b9c0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2b9d0 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
2b9e0 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
2b9f0 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
2ba00 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
2ba10 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
2ba20 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ba30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ba40 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2ba50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2ba60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2ba70 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
2ba80 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
2ba90 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d  st=%-7.2g order=
2baa0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
2bab0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2bac0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2bad0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2bae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2baf0 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2bb00 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2bb10 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2bb20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2bb30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2bb40 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
2bb50 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c  %-7.2g order=%c\
2bb60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2bb70 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2bb80 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
2bb90 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a  0), pTo->rCost,.
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbb0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2bbc0 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
2bbd0 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2bbe0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2bbf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2bc00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc10 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77  /* pWLoop is a w
2bc20 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74  inner.  Add it t
2bc30 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
2bc40 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
2bc50 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f      pTo->maskLoo
2bc60 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  p = pFrom->maskL
2bc70 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
2bc80 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
2bc90 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72  pTo->revLoop = r
2bca0 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  evMask;.        
2bcb0 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f  pTo->nRow = pFro
2bcc0 6d 2d 3e 6e 52 6f 77 20 2a 20 70 57 4c 6f 6f 70  m->nRow * pWLoop
2bcd0 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
2bce0 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
2bcf0 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
2bd00 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2bd10 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  = isOrderedValid
2bd20 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
2bd30 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64  sOrdered = isOrd
2bd40 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65  ered;.        me
2bd50 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c  mcpy(pTo->aLoop,
2bd60 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73   pFrom->aLoop, s
2bd70 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2bd80 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  )*iLoop);.      
2bd90 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f    pTo->aLoop[iLo
2bda0 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20  op] = pWLoop;.  
2bdb0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
2bdc0 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2bdd0 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
2bde0 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
2bdf0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
2be00 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
2be10 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
2be20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2be30 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
2be40 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f  st>mxCost ) mxCo
2be50 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
2be60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2be70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2be80 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
2be90 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2bea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2beb0 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a  hereTrace>=2 ){.
2bec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2bed0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
2bee0 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
2bef0 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
2bf00 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
2bf10 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
2bf20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
2bf30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2bf40 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
2bf50 73 74 3d 25 2d 37 2e 32 67 20 6e 72 6f 77 3d 25  st=%-7.2g nrow=%
2bf60 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c  -7.2g order=%c",
2bf70 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
2bf80 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2bf90 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2bfa0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2bfb0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
2bfc0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2bfd0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
2bfe0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2bff0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2c000 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
2c010 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d  redValid && pTo-
2c020 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
2c030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2c040 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
2c050 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
2c060 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
2c070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c080 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2c090 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
2c0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c0b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2c0c0 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
2c0d0 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
2c0e0 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
2c0f0 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
2c100 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
2c110 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
2c120 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
2c130 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
2c140 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   nTo;.  }..  /* 
2c150 54 45 4d 50 4f 52 41 52 59 20 2a 2f 0a 20 20 69  TEMPORARY */.  i
2c160 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 20 73  f( nFrom==0 ){ s
2c170 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2c180 20 70 53 70 61 63 65 29 3b 20 72 65 74 75 72 6e   pSpace); return
2c190 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 7d   SQLITE_ERROR; }
2c1a0 0a 20 20 61 73 73 65 72 74 28 20 6e 46 72 6f 6d  .  assert( nFrom
2c1b0 3e 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  >0 );.  .  /* Fi
2c1c0 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2c1d0 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
2c1e0 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
2c1f0 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
2c200 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
2c210 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
2c220 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
2c230 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
2c240 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
2c250 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
2c260 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
2c270 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
2c280 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
2c290 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
2c2a0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2c2b0 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
2c2c0 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
2c2d0 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
2c2e0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
2c2f0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2c300 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
2c310 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
2c320 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
2c330 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
2c340 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
2c350 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
2c360 6f 6f 70 2d 3e 69 54 61 62 3b 20 2f 2a 20 46 49  oop->iTab; /* FI
2c370 58 4d 45 3a 20 4f 6d 69 74 20 74 68 65 20 69 46  XME: Omit the iF
2c380 72 6f 6d 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20  rom field */.   
2c390 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2c3a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2c3b0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2c3c0 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
2c3d0 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e   }.  if( pFrom->
2c3e0 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
2c3f0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
2c400 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
2c410 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  By->nExpr;.    p
2c420 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
2c430 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
2c440 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
2c450 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
2c460 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
2c470 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
2c480 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
2c490 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
2c4a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
2c4b0 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
2c4c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2c4d0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
2c4e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2c4f0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
2c500 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2c510 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
2c520 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
2c530 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
2c540 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
2c550 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
2c560 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
2c570 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
2c580 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
2c590 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
2c5a0 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
2c5b0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
2c5c0 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
2c5d0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2c5e0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
2c5f0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
2c600 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
2c610 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2c620 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
2c630 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2c640 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2c650 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
2c660 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
2c670 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
2c680 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
2c690 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2c6a0 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
2c6b0 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
2c6c0 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
2c6d0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
2c6e0 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
2c6f0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
2c700 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
2c710 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2c720 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
2c730 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
2c740 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
2c750 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
2c760 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
2c770 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
2c780 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
2c790 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
2c7a0 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
2c7b0 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
2c7c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
2c7d0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
2c7e0 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
2c7f0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
2c800 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
2c810 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
2c820 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
2c830 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
2c840 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
2c850 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
2c860 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
2c870 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
2c880 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2c890 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
2c8a0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
2c8b0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8d0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
2c8e0 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
2c8f0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c910 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2c920 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
2c930 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
2c940 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
2c950 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
2c960 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
2c970 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
2c980 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
2c990 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
2c9a0 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
2c9b0 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
2c9c0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
2c9d0 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
2c9e0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
2c9f0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
2ca00 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
2ca10 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
2ca20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
2ca30 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
2ca40 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
2ca50 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2ca60 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
2ca70 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
2ca80 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2ca90 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
2caa0 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
2cab0 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
2cac0 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
2cad0 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
2cae0 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
2caf0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
2cb00 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
2cb10 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
2cb20 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
2cb30 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
2cb40 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
2cb50 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
2cb60 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
2cb70 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
2cb80 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
2cb90 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
2cba0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
2cbb0 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
2cbc0 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
2cbd0 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
2cbe0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
2cbf0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
2cc00 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
2cc10 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
2cc20 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
2cc30 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
2cc40 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
2cc50 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
2cc60 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
2cc70 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
2cc80 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
2cc90 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
2cca0 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
2ccb0 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
2ccc0 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
2ccd0 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
2cce0 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
2ccf0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
2cd00 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
2cd10 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
2cd20 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
2cd30 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
2cd40 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
2cd50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2cd60 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
2cd70 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
2cd80 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
2cd90 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
2cda0 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
2cdb0 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
2cdc0 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
2cdd0 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
2cde0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
2cdf0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
2ce00 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2ce10 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
2ce20 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
2ce30 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
2ce40 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
2ce50 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce60 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
2ce70 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
2ce80 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
2ce90 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
2cea0 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
2ceb0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
2cec0 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
2ced0 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
2cee0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2cef0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
2cf00 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
2cf10 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
2cf20 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
2cf30 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
2cf40 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
2cf50 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
2cf60 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
2cf70 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
2cf80 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
2cf90 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
2cfa0 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
2cfb0 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
2cfc0 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
2cfd0 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
2cfe0 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
2cff0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
2d000 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
2d010 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2d020 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
2d030 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
2d040 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
2d050 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2d060 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
2d070 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
2d080 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2d090 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
2d0a0 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
2d0b0 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
2d0c0 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
2d0d0 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
2d0e0 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
2d0f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
2d100 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
2d110 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
2d120 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
2d130 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
2d140 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
2d150 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
2d160 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61  R BY clause of a
2d170 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d180 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  t,.** if there i
2d190 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
2d1a0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
2d1b0 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
2d1c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
2d1d0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
2d1e0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2d1f0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
2d200 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
2d210 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
2d220 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
2d230 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
2d240 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
2d250 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
2d260 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
2d270 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
2d280 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
2d290 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
2d2a0 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 65 74  d and.** the ret
2d2b0 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 2e  urned WhereInfo.
2d2c0 6e 4f 42 53 61 74 20 66 69 65 6c 64 20 69 73 20  nOBSat field is 
2d2d0 73 65 74 20 74 6f 20 70 4f 72 64 65 72 42 79 2d  set to pOrderBy-
2d2e0 3e 6e 45 78 70 72 2e 20 20 54 68 69 73 0a 2a 2a  >nExpr.  This.**
2d2f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2d300 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
2d310 73 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  s an unnecessary
2d320 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
2d330 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20 61 6e  ult set.** if an
2d340 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
2d350 74 65 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  te for the ORDER
2d360 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
2d370 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
2d380 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
2d390 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
2d3a0 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
2d3b0 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
2d3c0 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
2d3d0 72 64 65 72 2c 20 74 68 65 6e 20 57 68 65 72 65  rder, then Where
2d3e0 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73 20 30  Info.nOBSat is 0
2d3f0 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
2d400 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2d410 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
2d420 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
2d430 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2d440 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2d450 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41  TabList,    /* A
2d460 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
2d470 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
2d480 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
2d490 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
2d4a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2d4b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2d4c0 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
2d4d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2d4e0 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
2d4f0 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
2d500 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c  nct,  /* The sel
2d510 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53  ect-list for DIS
2d520 54 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20  TINCT queries - 
2d530 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
2d540 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
2d550 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
2d560 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
2d570 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
2d580 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
2d590 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
2d5a0 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
2d5b0 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
2d5c0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
2d5d0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
2d5e0 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
2d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d600 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
2d610 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
2d620 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
2d630 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
2d640 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d650 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
2d660 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
2d670 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2d680 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
2d690 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
2d6a0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
2d6b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
2d6c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2d6d0 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
2d6e0 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
2d6f0 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
2d700 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
2d710 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
2d720 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
2d730 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
2d740 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
2d750 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
2d760 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
2d770 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
2d780 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
2d790 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
2d7a0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
2d7b0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
2d7c0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
2d7d0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2d7e0 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
2d7f0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 69  >a[] */.  int ii
2d800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d810 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d820 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
2d830 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2d840 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2d850 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2d860 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2d880 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a  eturn code */...
2d890 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e    /* Variable in
2d8a0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
2d8b0 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
2d8c0 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
2d8d0 3b 0a 20 20 73 57 4c 42 2e 70 50 61 72 73 65 20  ;.  sWLB.pParse 
2d8e0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 4c 42  = pParse;.  sWLB
2d8f0 2e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  .db = pParse->db
2d900 3b 0a 20 20 73 57 4c 42 2e 70 54 61 62 4c 69 73  ;.  sWLB.pTabLis
2d910 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2d920 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
2d930 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
2d940 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
2d950 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2d960 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2d970 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
2d980 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
2d990 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
2d9a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
2d9b0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
2d9c0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
2d9d0 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
2d9e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d9f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
2da00 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
2da10 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
2da20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2da30 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2da40 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
2da50 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
2da60 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
2da70 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
2da80 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
2da90 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
2daa0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
2dab0 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
2dac0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
2dad0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
2dae0 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
2daf0 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
2db00 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
2db10 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
2db20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
2db30 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
2db40 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
2db50 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
2db60 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
2db70 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2db80 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
2db90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
2dba0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2dbb0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2dbc0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2dbd0 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
2dbe0 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
2dbf0 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
2dc00 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
2dc10 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2dc20 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
2dc30 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
2dc40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
2dc50 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
2dc60 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2dc70 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
2dc80 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
2dc90 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
2dca0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
2dcb0 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
2dcc0 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
2dcd0 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
2dce0 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
2dcf0 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
2dd00 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
2dd10 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
2dd20 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
2dd30 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
2dd40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2dd50 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
2dd60 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
2dd70 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
2dd80 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
2dd90 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
2dda0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
2ddb0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
2ddc0 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20       nByteWInfo 
2ddd0 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  + .      sizeof(
2dde0 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20  WhereClause) +. 
2ddf0 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2de00 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20  eMaskSet).  );. 
2de10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2de20 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
2de30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2de40 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
2de50 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
2de60 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2de70 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2de80 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
2de90 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
2dea0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2deb0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2dec0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
2ded0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2dee0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
2def0 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20  Info->pDistinct 
2df00 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  = pDistinct;.  p
2df10 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
2df20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2df30 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
2df40 6f 2d 3e 70 57 43 20 3d 20 28 57 68 65 72 65 43  o->pWC = (WhereC
2df50 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
2df60 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
2df70 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
2df80 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
2df90 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
2dfa0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2dfb0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
2dfc0 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
2dfd0 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
2dfe0 65 74 2a 29 26 70 57 49 6e 66 6f 2d 3e 70 57 43  et*)&pWInfo->pWC
2dff0 5b 31 5d 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  [1];.  sWLB.pWIn
2e000 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
2e010 57 4c 42 2e 70 57 43 20 3d 20 70 57 49 6e 66 6f  WLB.pWC = pWInfo
2e020 2d 3e 70 57 43 3b 0a 0a 20 20 2f 2a 20 44 69 73  ->pWC;..  /* Dis
2e030 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
2e040 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
2e050 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
2e060 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
2e070 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
2e080 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
2e090 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2e0a0 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
2e0b0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
2e0c0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2e0d0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
2e0e0 29 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  ) pDistinct = 0;
2e0f0 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
2e100 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2e110 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
2e120 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
2e130 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
2e140 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
2e150 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
2e160 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
2e170 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
2e180 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
2e190 6c 61 75 73 65 49 6e 69 74 28 70 57 49 6e 66 6f  lauseInit(pWInfo
2e1a0 2d 3e 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  ->pWC, pParse, p
2e1b0 4d 61 73 6b 53 65 74 2c 20 77 63 74 72 6c 46 6c  MaskSet, wctrlFl
2e1c0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ags);.  sqlite3E
2e1d0 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
2e1e0 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
2e1f0 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
2e200 57 49 6e 66 6f 2d 3e 70 57 43 2c 20 70 57 68 65  WInfo->pWC, pWhe
2e210 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f  re, TK_AND);   /
2e220 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35  * IMP: R-15842-5
2e230 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  3296 */.    .  /
2e240 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
2e250 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2e260 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
2e270 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
2e280 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
2e290 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
2e2a0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
2e2b0 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
2e2c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
2e2d0 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
2e2e0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
2e2f0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
2e300 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
2e310 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2e320 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2e330 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
2e340 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
2e350 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
2e360 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
2e370 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
2e380 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
2e390 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
2e3a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2e3b0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
2e3c0 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
2e3d0 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
2e3e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
2e3f0 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
2e400 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
2e410 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
2e420 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
2e430 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
2e440 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
2e450 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2e460 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
2e470 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
2e480 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
2e490 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
2e4a0 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
2e4b0 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
2e4c0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
2e4d0 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
2e4e0 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
2e4f0 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
2e500 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
2e510 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
2e520 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
2e530 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
2e540 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
2e550 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
2e560 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
2e570 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
2e580 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2e590 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
2e5a0 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
2e5b0 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
2e5c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2e5d0 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2e5e0 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
2e5f0 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
2e600 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  15..  **.  ** No
2e610 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2e620 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2e630 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2e640 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2e650 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2e660 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2e670 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2e680 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2e690 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
2e6a0 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2e6b0 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2e6c0 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2e6d0 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
2e6e0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2e6f0 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
2e700 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
2e710 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2e720 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61   ii++){.    crea
2e730 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
2e740 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
2e750 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  .iCursor);.  }.#
2e760 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e770 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
2e780 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
2e790 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2e7a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2e7b0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  ++){.      Bitma
2e7c0 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk m = getMask(p
2e7d0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2e7e0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
2e7f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e800 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
2e810 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
2e820 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
2e830 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2e840 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
2e850 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2e860 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
2e870 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
2e880 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
2e890 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
2e8a0 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
2e8b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2e8c0 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
2e8d0 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
2e8e0 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
2e8f0 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
2e900 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
2e910 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
2e920 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
2e930 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
2e940 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
2e950 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
2e960 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
2e970 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 70  eAll(pTabList, p
2e980 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 69  WInfo->pWC);.  i
2e990 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2e9a0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2e9b0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2e9c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
2e9d0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
2e9e0 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66 20 74   qualifier, if t
2e9f0 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 73 20  here is one, is 
2ea00 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a  redundant. .  **
2ea10 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2ea20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20 74 6f  set pDistinct to
2ea30 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72 65 49   NULL and WhereI
2ea40 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20 74 6f  nfo.eDistinct to
2ea50 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49 53 54  .  ** WHERE_DIST
2ea60 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f 20 74  INCT_UNIQUE to t
2ea70 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ell the caller t
2ea80 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44 49 53  o ignore the DIS
2ea90 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  TINCT..  */.  if
2eaa0 28 20 70 44 69 73 74 69 6e 63 74 20 26 26 20 69  ( pDistinct && i
2eab0 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
2eac0 6e 74 28 70 50 61 72 73 65 2c 70 54 61 62 4c 69  nt(pParse,pTabLi
2ead0 73 74 2c 70 57 49 6e 66 6f 2d 3e 70 57 43 2c 70  st,pWInfo->pWC,p
2eae0 44 69 73 74 69 6e 63 74 29 20 29 7b 0a 20 20 20  Distinct) ){.   
2eaf0 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a   pDistinct = 0;.
2eb00 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2eb10 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2eb20 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2eb30 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
2eb40 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
2eb50 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48   objects */.  WH
2eb60 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2eb70 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
2eb80 2a 2a 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  **\n"));.  rc = 
2eb90 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
2eba0 26 73 57 4c 42 29 3b 0a 20 20 69 66 28 20 72 63  &sWLB);.  if( rc
2ebb0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2ebc0 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 44  inError;..  /* D
2ebd0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
2ebe0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2ebf0 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63  cts if wheretrac
2ec00 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  e is enabled */.
2ec10 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2ec20 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2ec30 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2ec40 65 20 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f  e ){.    WhereLo
2ec50 6f 70 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 69  op *p;.    int i
2ec60 20 3d 20 30 3b 0a 20 20 20 20 73 74 61 74 69 63   = 0;.    static
2ec70 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
2ec80 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
2ec90 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2eca0 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
2ecd0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2ece0 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 66  STUVWYXZ";.    f
2ecf0 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  or(p=pWInfo->pLo
2ed00 6f 70 73 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ops; p; p=p->pNe
2ed10 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 70  xtLoop){.      p
2ed20 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 28  ->cId = zLabel[(
2ed30 69 2b 2b 29 25 73 69 7a 65 6f 66 28 7a 4c 61 62  i++)%sizeof(zLab
2ed40 65 6c 29 5d 3b 0a 20 20 20 20 20 20 77 68 65 72  el)];.      wher
2ed50 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54  eLoopPrint(p, pT
2ed60 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
2ed70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 65   }.#endif..  whe
2ed80 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
2ed90 6e 66 6f 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20  nfo, -1);.  if( 
2eda0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2edb0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2edc0 69 6e 45 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  inError;.  if( p
2edd0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2ede0 29 7b 0a 20 20 20 20 20 77 68 65 72 65 50 61 74  ){.     wherePat
2edf0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2ee00 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
2ee10 3b 0a 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ;.     if( db->m
2ee20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2ee30 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2ee40 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
2ee50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2ee60 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
2ee70 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
2ee80 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c   int ii;.    sql
2ee90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2eea0 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 22 29  "---- Solution")
2eeb0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2eec0 2d 3e 6e 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->nOBSat ){.    
2eed0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2eee0 69 6e 74 66 28 22 20 4f 52 44 45 52 20 42 59 20  intf(" ORDER BY 
2eef0 6f 6d 69 74 74 65 64 20 72 65 76 3d 30 78 25 6c  omitted rev=0x%l
2ef00 6c 78 5c 6e 22 2c 20 70 57 49 6e 66 6f 2d 3e 72  lx\n", pWInfo->r
2ef10 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  evMask);.    }el
2ef20 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2ef30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
2ef40 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ");.    }.    fo
2ef50 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
2ef60 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
2ef70 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
2ef80 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
2ef90 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
2efa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2efb0 69 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  if.  WHERETRACE(
2efc0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
2efd0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
2efe0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2eff0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2f000 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2f010 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2f020 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 23 69 66 20  Error;.  }..#if 
2f030 30 20 20 2f 2a 20 46 49 58 4d 45 3a 20 41 64 64  0  /* FIXME: Add
2f040 20 74 68 69 73 20 62 61 63 6b 20 69 6e 3f 20 2a   this back in? *
2f050 2f 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  /.  /* If the ca
2f060 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
2f070 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2f080 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
2f090 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
2f0a0 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
2f0b0 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
2f0c0 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
2f0d0 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
2f0e0 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61  * The one-pass a
2f0f0 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f  lgorithm only wo
2f100 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45  rks if the WHERE
2f110 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
2f120 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  nts.  ** the sta
2f130 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65  tement to update
2f140 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
2f150 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
2f160 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2f170 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2f180 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
2f190 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
2f1a0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2f1b0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2f1c0 44 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28  DESIRED)!=0 && (
2f1d0 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
2f1e0 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20  _UNIQUE)!=0 ){. 
2f1f0 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65     pWInfo->okOne
2f200 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57  Pass = 1;.    pW
2f210 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e  Info->a[0].plan.
2f220 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
2f230 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
2f240 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 65  #endif..  /* Ope
2f250 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
2f260 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
2f270 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
2f280 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
2f290 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
2f2a0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
2f2b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2f2c0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
2f2d0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
2f2e0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
2f2f0 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65   Goto */.  notRe
2f300 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2f310 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  0;.  pWInfo->nRo
2f320 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31  wOut = (double)1
2f330 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  ;.  for(ii=0, pL
2f340 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2f350 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2f360 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2f370 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2f380 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2f390 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2f3a0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2f3b0 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2f3c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2f3d0 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
2f3e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2f3f0 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20 20  em *pTabItem;.  
2f400 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2f410 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  op;..    pTabIte
2f420 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2f430 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2f440 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2f450 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2f460 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2f470 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2f480 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2f490 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
2f4a0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
2f4b0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2f4c0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2f4d0 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2f4e0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2f4f0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2f500 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2f510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2f520 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2f530 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2f540 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2f550 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2f560 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2f570 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2f580 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2f590 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2f5a0 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2f5b0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2f5c0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2f5d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2f5e0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2f5f0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2f600 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2f610 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
2f620 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
2f630 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
2f640 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2f650 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2f660 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2f670 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2f680 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2f690 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
2f6a0 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
2f6b0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2f6c0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2f6d0 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
2f6e0 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
2f6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
2f700 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
2f710 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2f720 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
2f730 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2f740 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
2f750 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
2f760 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f  tcase( pTab->nCo
2f770 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2f780 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
2f790 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
2f7a0 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20  nCol<BMS ){.    
2f7b0 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
2f7c0 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2f7d0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2f7e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2f7f0 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
2f800 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
2f810 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2f820 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
2f830 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
2f840 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2f860 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2f870 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
2f880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f890 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
2f8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f8b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2f8c0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
2f8d0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
2f8e0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
2f8f0 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  me);.    }.#ifnd
2f900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f910 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2f920 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2f930 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
2f940 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  EMP_INDEX)!=0 ){
2f950 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
2f960 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
2f970 50 61 72 73 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  Parse, pWInfo->p
2f980 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
2f990 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2f9a0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2f9b0 66 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  f.    if( pLoop-
2f9c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2f9d0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2f9e0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2f9f0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2fa00 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  ndex;.      KeyI
2fa10 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
2fa20 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
2fa30 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
2fa40 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 41      /* FIXME:  A
2fa50 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2fa60 6e 20 75 73 65 20 70 54 61 62 49 74 65 6d 2d 3e  n use pTabItem->
2fa70 69 43 75 72 73 6f 72 20 69 66 20 57 48 45 52 45  iCursor if WHERE
2fa80 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20  _IDX_ONLY */.   
2fa90 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
2faa0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
2fab0 75 72 20 3d 20 69 49 64 78 43 75 72 20 3f 20 69  ur = iIdxCur ? i
2fac0 49 64 78 43 75 72 20 3a 20 70 50 61 72 73 65 2d  IdxCur : pParse-
2fad0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
2fae0 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
2faf0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
2fb00 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
2fb10 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
2fb20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2fb30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2fb40 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64  P_OpenRead, iInd
2fb50 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
2fb60 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2fb80 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
2fb90 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
2fba0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2fbb0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
2fbc0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
2fbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
2fbe0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2fbf0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e  rse, iDb);.    n
2fc00 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
2fc10 61 73 6b 28 70 57 49 6e 66 6f 2d 3e 70 57 43 2d  ask(pWInfo->pWC-
2fc20 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >pMaskSet, pTabI
2fc30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2fc40 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
2fc50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2fc60 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2fc70 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fc80 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2fc90 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2fca0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2fcb0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
2fcc0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
2fcd0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
2fce0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
2fcf0 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
2fd00 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
2fd10 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
2fd20 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
2fd30 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
2fd40 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2fd50 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
2fd60 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
2fd70 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
2fd80 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20  pWInfo->a[ii];. 
2fd90 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
2fda0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2fdb0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
2fdc0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
2fdd0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
2fde0 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
2fdf0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
2fe00 66 6f 2c 20 69 69 2c 20 77 63 74 72 6c 46 6c 61  fo, ii, wctrlFla
2fe10 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  gs, notReady);. 
2fe20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2fe30 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2fe40 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20  ddrCont;.  }..  
2fe50 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65  /* Done. */.  re
2fe60 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
2fe70 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2fe80 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2fe90 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
2fea0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
2feb0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
2fec0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2fed0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2fee0 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
2fef0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2ff00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ff10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2ff20 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
2ff30 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
2ff40 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
2ff50 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
2ff60 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
2ff70 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2ff80 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2ff90 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
2ffa0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
2ffb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2ffc0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2ffd0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
2ffe0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2fff0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
30000 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68  el *pLevel;.  Wh
30010 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
30020 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
30030 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
30040 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
30050 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
30060 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
30070 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
30080 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
30090 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
300a0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
300b0 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
300c0 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
300d0 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
300e0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
300f0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
30100 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
30110 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
30120 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
30130 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
30140 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30150 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
30160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30170 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c  AddOp2(v, pLevel
30180 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
30190 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
301a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
301b0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
301c0 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20  el->p5);.    }. 
301d0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
301e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
301f0 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
30200 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
30210 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
30220 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
30230 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
30240 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30250 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
30260 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
30270 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
30280 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
30290 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
302a0 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
302b0 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
302c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
302d0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
302e0 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
302f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30300 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
30310 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
30320 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
30330 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
30340 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
30350 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
30360 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
30370 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
30380 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
30390 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
303a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
303b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
303c0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
303d0 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
303e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
303f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
30400 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
30410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30420 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
30430 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
30440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30450 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
30460 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
30470 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
30480 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
30490 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
304a0 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
304b0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
304c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
304d0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
304e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
304f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
30500 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
30510 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30530 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
30540 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
30550 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30560 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30570 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
30580 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
30590 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
305a0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
305b0 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
305c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
305d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
305e0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
305f0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
30600 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
30630 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
30640 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
30650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30660 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
30670 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
30680 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
30690 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
306a0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
306b0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
306c0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
306d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
306e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
306f0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
30700 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
30710 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
30720 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
30730 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
30740 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
30750 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
30760 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  ->nLevel==1 || p
30770 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  WInfo->nLevel==p
30780 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
30790 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
307a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
307b0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
307c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
307d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
307e0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
307f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
30800 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
30810 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
30820 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
30830 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
30840 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
30850 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
30860 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
30870 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
30880 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
30890 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
308a0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
308b0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
308c0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
308d0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
308e0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
308f0 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
30900 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f      int ws = pLo
30910 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
30920 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
30930 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
30940 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30950 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
30960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30970 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
30980 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
30990 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
309a0 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
309b0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
309c0 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50   (ws & (WHERE_IP
309d0 4b 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  K|WHERE_TEMP_IND
309e0 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  EX))==0 ){.     
309f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30a00 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
30a10 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
30a20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30a30 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
30a40 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
30a50 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
30a60 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
30a70 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
30a80 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
30a90 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
30aa0 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
30ab0 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
30ac0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
30ad0 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
30ae0 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
30af0 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
30b00 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
30b10 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
30b20 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
30b30 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
30b40 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
30b50 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
30b60 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
30b70 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
30b80 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
30b90 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
30ba0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
30bb0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
30bc0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
30bd0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
30be0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
30bf0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30c00 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
30c10 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
30c20 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
30c30 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
30c40 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
30c50 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
30c60 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
30c70 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
30c80 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
30c90 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
30ca0 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
30cb0 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
30cc0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
30cd0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
30ce0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
30cf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30d00 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
30d10 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
30d20 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
30d30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
30d40 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
30d50 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
30d60 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
30d70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
30d80 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
30d90 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
30da0 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
30db0 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21     if( pIdx && !
30dc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
30dd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c   ){.      int k,
30de0 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
30df0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
30e00 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
30e10 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
30e20 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
30e30 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
30e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
30e50 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
30e60 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
30e70 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
30e80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
30e90 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
30ea0 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
30eb0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
30ec0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
30ed0 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
30ee0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
30ef0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
30f00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30f10 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
30f20 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
30f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30f40 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
30f50 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
30f60 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
30f70 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
30f80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30fb0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
30fc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30fd0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
30fe0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  j<pIdx->nColumn 
30ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
31000 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
31010 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
31020 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
31030 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
31040 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
31050 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
31060 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
31070 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31080 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
31090 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
310a0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
310b0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
310c0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
310d0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
310e0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
310f0 72 6e 3b 0a 7d 0a                                rn;.}.