/ Hex Artifact Content
Login

Artifact 3e9b7b3323f78ec3056c5e3aa3443661bc590054:


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 43  ef struct WhereC
0570: 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 74  ost WhereCost;.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 4c 6f 6f 70 20 57 68 65 72 65 4c 6f 6f  ereLoop WhereLoo
05a0: 70 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  p;.typedef struc
05b0: 74 20 57 68 65 72 65 50 61 74 68 20 57 68 65 72  t WherePath Wher
05c0: 65 50 61 74 68 3b 0a 74 79 70 65 64 65 66 20 73  ePath;.typedef s
05d0: 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20  truct WhereTerm 
05e0: 57 68 65 72 65 54 65 72 6d 3b 0a 74 79 70 65 64  WhereTerm;.typed
05f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  ef struct WhereL
0600: 6f 6f 70 42 75 69 6c 64 65 72 20 57 68 65 72 65  oopBuilder Where
0610: 4c 6f 6f 70 42 75 69 6c 64 65 72 3b 0a 74 79 70  LoopBuilder;.typ
0620: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0630: 65 53 63 61 6e 20 57 68 65 72 65 53 63 61 6e 3b  eScan WhereScan;
0640: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0650: 57 68 65 72 65 56 74 61 62 50 6c 61 6e 20 57 68  WhereVtabPlan Wh
0660: 65 72 65 56 74 61 62 50 6c 61 6e 3b 0a 0a 0a 2f  ereVtabPlan;.../
0670: 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
0680: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
0690: 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 77  t represents a w
06a0: 61 79 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  ay of evaluating
06b0: 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20   one.** term of 
06c0: 61 20 6a 6f 69 6e 2e 20 20 54 68 65 20 57 68 65  a join.  The Whe
06d0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
06e0: 68 6f 6c 64 73 20 61 20 74 61 62 6c 65 20 6f 66  holds a table of
06f0: 20 74 68 65 73 65 0a 2a 2a 20 6f 62 6a 65 63 74   these.** object
0700: 73 20 75 73 69 6e 67 20 28 6d 61 73 6b 53 65 6c  s using (maskSel
0710: 66 2c 70 72 65 72 65 71 2c 29 20 61 73 20 74 68  f,prereq,) as th
0720: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
0730: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  Note that the.**
0740: 20 73 61 6d 65 20 6a 6f 69 6e 20 74 65 72 6d 20   same join term 
0750: 6d 69 67 68 74 20 68 61 76 65 20 6d 75 6c 74 69  might have multi
0760: 70 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 57  ple associated W
0770: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
0780: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
0790: 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73  eLoop {.  Bitmas
07a0: 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  k prereq;       
07b0: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74  /* Bitmask of ot
07c0: 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d  her loops that m
07d0: 75 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f  ust run first */
07e0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53  .  Bitmask maskS
07f0: 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d  elf;     /* Bitm
0800: 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20  ask identifying 
0810: 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69  table iTab */.#i
0820: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0830: 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20 20  G.  char cId;   
0840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
0850: 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73  bolic ID of this
0860: 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67   loop for debugg
0870: 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69  ing use */.#endi
0880: 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20 20  f.  u8 iTab;    
0890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
08a0: 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c  ition in FROM cl
08b0: 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f  ause of table fo
08c0: 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
08d0: 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20   u8 iSortIdx;   
08e0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e         /* Sortin
08f0: 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20  g index number. 
0900: 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 75 31   0==None */.  u1
0910: 36 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  6 nTerm;        
0920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0930: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 65 72   entries in aTer
0940: 6d 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 77 73 46  m[] */.  u32 wsF
0950: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 2f  lags;          /
0960: 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  * WHERE_* flags 
0970: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 70  describing the p
0980: 6c 61 6e 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  lan */.  double 
0990: 72 53 65 74 75 70 3b 20 20 20 20 20 20 20 20 2f  rSetup;        /
09a0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65 74 75 70  * One-time setup
09b0: 20 63 6f 73 74 20 28 65 78 3a 20 63 72 65 61 74   cost (ex: creat
09c0: 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  e transient inde
09d0: 78 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  x) */.  double r
09e0: 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Run;          /*
09f0: 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   Cost of running
0a00: 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f 0a 20 20   each loop */.  
0a10: 64 6f 75 62 6c 65 20 6e 4f 75 74 3b 20 20 20 20  double nOut;    
0a20: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
0a30: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0a40: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 75 6e  put rows */.  un
0a50: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
0a60: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
0a70: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0a80: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 62 74 72  for internal btr
0a90: 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  ee tables */.   
0aa0: 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
0ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0ac0: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
0ad0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
0ae0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64       Index *pInd
0af0: 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ex;         /* I
0b00: 6e 64 65 78 20 75 73 65 64 2c 20 6f 72 20 4e 55  ndex used, or NU
0b10: 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62 74 72 65  LL */.    } btre
0b20: 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 20  e;.    struct { 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b40: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   Information for
0b50: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
0b60: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  */.      int idx
0b70: 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Num;            
0b80: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
0b90: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e 65 65 64  */.      u8 need
0ba0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
0bb0: 2f 2a 20 54 72 75 65 20 69 66 20 73 71 6c 69 74  /* True if sqlit
0bc0: 65 33 5f 66 72 65 65 28 69 64 78 53 74 72 29 20  e3_free(idxStr) 
0bd0: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  is needed */.   
0be0: 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b     u8 isOrdered;
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0c00: 65 20 69 66 20 73 61 74 69 73 66 69 65 73 20 4f  e if satisfies O
0c10: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20  RDER BY */.     
0c20: 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b 3b 20 20   u16 omitMask;  
0c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 73          /* Terms
0c40: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 6d 69   that may be omi
0c50: 74 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 63 68  tted */.      ch
0c60: 61 72 20 2a 69 64 78 53 74 72 3b 20 20 20 20 20  ar *idxStr;     
0c70: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 64       /* Index id
0c80: 65 6e 74 69 66 69 65 72 20 73 74 72 69 6e 67 20  entifier string 
0c90: 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62 3b 0a 20  */.    } vtab;. 
0ca0: 20 7d 20 75 3b 0a 20 20 57 68 65 72 65 54 65 72   } u;.  WhereTer
0cb0: 6d 20 2a 2a 61 54 65 72 6d 3b 20 20 20 20 2f 2a  m **aTerm;    /*
0cc0: 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64   WhereTerms used
0cd0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
0ce0: 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e  *pNextLoop; /* N
0cf0: 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ext WhereLoop ob
0d00: 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72  ject in the Wher
0d10: 65 43 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  eClause */.};../
0d20: 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
0d30: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
0d40: 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75 65 6e  t holds a sequen
0d50: 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ce of WhereLoop 
0d60: 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61 74 20  objects.** that 
0d70: 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65 20 6f  implement some o
0d80: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6e 74  r all of the ent
0d90: 69 72 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20  ire query plan. 
0da0: 20 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72   .*/.struct Wher
0db0: 65 50 61 74 68 20 7b 0a 20 20 42 69 74 6d 61 73  ePath {.  Bitmas
0dc0: 6b 20 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20  k maskLoop;     
0dd0: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
0de0: 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
0df0: 63 74 73 20 69 6e 20 74 68 69 73 20 70 61 74 68  cts in this path
0e00: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
0e10: 76 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61  vLoop;      /* a
0e20: 4c 6f 6f 70 5b 5d 73 20 74 68 61 74 20 73 68 6f  Loop[]s that sho
0e30: 75 6c 64 20 62 65 20 72 65 76 65 72 73 65 64 20  uld be reversed 
0e40: 66 6f 72 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  for ORDER BY */.
0e50: 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
0e60: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
0e70: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
0e80: 6f 77 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  ows generated by
0e90: 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20   this path */.  
0ea0: 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20  double rCost;   
0eb0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
0ec0: 6f 73 74 20 6f 66 20 74 68 69 73 20 70 61 74 68  ost of this path
0ed0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
0ee0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ed;         /* T
0ef0: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 74 68  rue if this path
0f00: 20 73 61 74 69 73 66 69 65 73 20 4f 52 44 45 52   satisfies ORDER
0f10: 20 42 59 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72   BY */.  u8 isOr
0f20: 64 65 72 65 64 56 61 6c 69 64 3b 20 20 20 20 2f  deredValid;    /
0f30: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 69 73  * True if the is
0f40: 4f 72 64 65 72 65 64 20 66 69 65 6c 64 20 69 73  Ordered field is
0f50: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72   valid */.  Wher
0f60: 65 4c 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20  eLoop **aLoop;  
0f70: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 68    /* Array of Wh
0f80: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
0f90: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
0fa0: 73 20 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  s path */.};../*
0fb0: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0fc0: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0fd0: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0fe0: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0ff0: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
1000: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
1010: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
1020: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1030: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
1040: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
1050: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
1060: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
1070: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
1080: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
1090: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
10a0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
10b0: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
10c0: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
10d0: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
10e0: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
10f0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
1100: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
1110: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
1120: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
1130: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
1140: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
1150: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
1160: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
1170: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
1180: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
1190: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
11a0: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
11b0: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
11c0: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
11d0: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
11e0: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
11f0: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
1200: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
1210: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
1220: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
1230: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
1240: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
1250: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
1260: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
1270: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
1280: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
1290: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
12a0: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
12b0: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
12c0: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
12d0: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
12e0: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
12f0: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
1300: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
1310: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
1320: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
1330: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
1340: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
1350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
1360: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
1370: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1380: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
1390: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
13a0: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
13b0: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
13c0: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
13d0: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
13e0: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
13f0: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
1400: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
1410: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
1420: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
1430: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
1440: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
1450: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
1460: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
1470: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
1480: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
1490: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
14a0: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
14b0: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
14c0: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
14d0: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
14e0: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
14f0: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
1500: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
1510: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
1520: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
1530: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
1540: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
1550: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
1560: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
1570: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
1580: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
1590: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
15a0: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
15b0: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
15c0: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
15d0: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
15e0: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
15f0: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
1600: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
1610: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
1620: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
1630: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
1640: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
1650: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
1660: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
1670: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
1680: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
1690: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
16a0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
16b0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
16c0: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
16d0: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
16e0: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
16f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1700: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
1710: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
1720: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
1730: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
1740: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
1750: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
1760: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
1770: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
1780: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
1790: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
17a0: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
17b0: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
17c0: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
17d0: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
17e0: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
17f0: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
1800: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
1810: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
1820: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
1830: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
1840: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
1850: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1860: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1870: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
1880: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
1890: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
18a0: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
18b0: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
18c0: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
18d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18e0: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
18f0: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
1900: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
1910: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
1920: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
1930: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
1940: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
1950: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
1960: 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  les..*/.struct W
1970: 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70  hereTerm {.  Exp
1980: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
1990: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19a0: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
19b0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69  sion that is thi
19c0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
19d0: 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
19e0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70      /* Disable p
19f0: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77  WC->a[iParent] w
1a00: 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69  hen this term di
1a10: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sabled */.  int 
1a20: 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20  leftCursor;     
1a30: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1a40: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
1a50: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
1a60: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e    union {.    in
1a70: 74 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20  t leftColumn;   
1a80: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
1a90: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
1aa0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
1ab0: 2f 0a 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66  /.    WhereOrInf
1ac0: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a  o *pOrInfo;   /*
1ad0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1ae0: 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72  on if (eOperator
1af0: 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a   & WO_OR)!=0 */.
1b00: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
1b10: 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45   *pAndInfo; /* E
1b20: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
1b30: 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72 26 20   if (eOperator& 
1b40: 57 4f 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20  WO_AND)!=0 */.  
1b50: 7d 20 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72  } u;.  u16 eOper
1b60: 61 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f  ator;          /
1b70: 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20  * A WO_xx value 
1b80: 64 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20  describing <op> 
1b90: 2a 2f 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b  */.  u8 wtFlags;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 54 45 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61  TERM_xxx bit fla
1bc0: 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a  gs.  See below *
1bd0: 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20  /.  u8 nChild;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bf0: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65  umber of childre
1c00: 6e 20 74 68 61 74 20 6d 75 73 74 20 64 69 73 61  n that must disa
1c10: 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72  ble us */.  Wher
1c20: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1c30: 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73      /* The claus
1c40: 65 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  e this term is p
1c50: 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d  art of */.  Bitm
1c60: 61 73 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b  ask prereqRight;
1c70: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
1c80: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 62 79  f tables used by
1c90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a   pExpr->pRight *
1ca0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1cb0: 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42  eqAll;      /* B
1cc0: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1cd0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70   referenced by p
1ce0: 45 78 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Expr */.};../*.*
1cf0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
1d00: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74   of WhereTerm.wt
1d10: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
1d20: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20   TERM_DYNAMIC   
1d30: 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20   0x01   /* Need 
1d40: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45  to call sqlite3E
1d50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1d60: 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  xpr) */.#define 
1d70: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20  TERM_VIRTUAL    
1d80: 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20  0x02   /* Added 
1d90: 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
1da0: 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a  .  Do not code *
1db0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43  /.#define TERM_C
1dc0: 4f 44 45 44 20 20 20 20 20 20 30 78 30 34 20 20  ODED      0x04  
1dd0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73   /* This term is
1de0: 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a   already coded *
1df0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43  /.#define TERM_C
1e00: 4f 50 49 45 44 20 20 20 20 20 30 78 30 38 20 20  OPIED     0x08  
1e10: 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20   /* Has a child 
1e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
1e30: 4f 52 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20  ORINFO     0x10 
1e40: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65    /* Need to fre
1e50: 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  e the WhereTerm.
1e60: 75 2e 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  u.pOrInfo object
1e70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
1e80: 5f 41 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30  _ANDINFO    0x20
1e90: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72     /* Need to fr
1ea0: 65 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  ee the WhereTerm
1eb0: 2e 75 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20  .u.pAndInfo obj 
1ec0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
1ed0: 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20  OR_OK      0x40 
1ee0: 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67    /* Used during
1ef0: 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65   OR-clause proce
1f00: 73 73 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  ssing */.#ifdef 
1f10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1f20: 41 54 33 0a 23 20 20 64 65 66 69 6e 65 20 54 45  AT3.#  define TE
1f30: 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30 78 38 30  RM_VNULL    0x80
1f40: 20 20 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72     /* Manufactur
1f50: 65 64 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d  ed x>NULL or x<=
1f60: 4e 55 4c 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c  NULL term */.#el
1f70: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52  se.#  define TER
1f80: 4d 5f 56 4e 55 4c 4c 20 20 20 20 30 78 30 30 20  M_VNULL    0x00 
1f90: 20 20 2f 2a 20 44 69 73 61 62 6c 65 64 20 69 66    /* Disabled if
1fa0: 20 6e 6f 74 20 75 73 69 6e 67 20 73 74 61 74 33   not using stat3
1fb0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1fc0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1fd0: 20 74 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   the WhereScan o
1fe0: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 61 73  bject is used as
1ff0: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 66 6f 72   an iterator for
2000: 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72   locating.** ter
2010: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2020: 63 6c 61 75 73 65 20 74 68 61 74 20 61 72 65 20  clause that are 
2030: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 71 75  useful to the qu
2040: 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
2050: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
2060: 20 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a   {.  WhereTerm *
2070: 70 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  pCurrent;       
2080: 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 6d  /* Most recent m
2090: 61 74 63 68 20 2a 2f 0a 20 20 57 68 65 72 65 43  atch */.  WhereC
20a0: 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20  lause *pOrigWC; 
20b0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
20c0: 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72  , innermost Wher
20d0: 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65  eClause */.  Whe
20e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
20f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
2100: 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79  Clause currently
2110: 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a   being scanned *
2120: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e  /.  char *zCollN
2130: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2140: 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61  * Required colla
2150: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69  ting sequence, i
2160: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
2170: 63 68 61 72 20 69 64 78 61 66 66 3b 20 20 20 20  char idxaff;    
2180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2190: 73 74 20 6d 61 74 63 68 20 74 68 69 73 20 61 66  st match this af
21a0: 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c 6c  finity, if zColl
21b0: 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  Name!=NULL */.  
21c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 45  unsigned char nE
21d0: 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 75  quiv;      /* Nu
21e0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
21f0: 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20  in aEquiv[] */. 
2200: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
2210: 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e  Equiv;      /* N
2220: 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  ext unused slot 
2230: 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20  in aEquiv[] */. 
2240: 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20   u32 opMask;    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2260: 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61 74  cceptable operat
2270: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20  ors */.  int k; 
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 63      /* Resume sc
22a0: 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d 3e  anning at this->
22b0: 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20  pWC->a[this->k] 
22c0: 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b  */.  int aEquiv[
22d0: 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  22];            
22e0: 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e  /* Cursor,Column
22f0: 20 70 61 69 72 73 20 66 6f 72 20 65 71 75 69 76   pairs for equiv
2300: 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20 2a  alence classes *
2310: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
2320: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2330: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2340: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
2350: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
2360: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2370: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
2380: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
2390: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
23a0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  ereTerms..**.** 
23b0: 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70  Explanation of p
23c0: 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48  Outer:  For a WH
23d0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
23e0: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
23f0: 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62         a AND ((b
2400: 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e   AND c) OR (d AN
2410: 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a  D e)) AND f.**.*
2420: 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61  * There are sepa
2430: 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65  rate WhereClause
2440: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65   objects for the
2450: 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e   whole clause an
2460: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62  d for.** the sub
2470: 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20  clauses "(b AND 
2480: 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20  c)" and "(d AND 
2490: 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72  e)".  The pOuter
24a0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a   field of the.**
24b0: 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e   subclauses poin
24c0: 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ts to the WhereC
24d0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72  lause object for
24e0: 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73   the whole claus
24f0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
2500: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
2510: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2530: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2540: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2550: 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70  MaskSet;  /* Map
2560: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75  ping of table cu
2570: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2580: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68  bitmasks */.  Wh
2590: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65  ereClause *pOute
25a0: 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20  r;     /* Outer 
25b0: 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  conjunction */. 
25c0: 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20   u8 op;         
25d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c            /* Spl
25e0: 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b  it operator.  TK
25f0: 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f  _AND or TK_OR */
2600: 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
2610: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  s;          /* M
2620: 69 67 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45  ight include WHE
2630: 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20  RE_AND_ONLY */. 
2640: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
2650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2660: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  ber of terms */.
2670: 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
2680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2690: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
26a0: 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  in a[] */.  Wher
26b0: 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20  eTerm *a;       
26c0: 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d       /* Each a[]
26d0: 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65 72   describes a ter
26e0: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
26f0: 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66  luase */.#if def
2700: 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c  ined(SQLITE_SMAL
2710: 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65  L_STACK).  Where
2720: 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b  Term aStatic[1];
2730: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73      /* Initial s
2740: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
2750: 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57  a[] */.#else.  W
2760: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
2770: 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69  [8];    /* Initi
2780: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
2790: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69  for a[] */.#endi
27a0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68  f.};../*.** A Wh
27b0: 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70  ereTerm with eOp
27c0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61  erator==WO_OR ha
27d0: 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20  s its u.pOrInfo 
27e0: 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a  pointer set to.*
27f0: 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  * a dynamically 
2800: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e  allocated instan
2810: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2820: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
2830: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72  /.struct WhereOr
2840: 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c  Info {.  WhereCl
2850: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
2860: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
2870: 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  on into subterms
2880: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
2890: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  dexable;       /
28a0: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  * Bitmask of all
28b0: 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65   indexable table
28c0: 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20  s in the clause 
28d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  */.};../*.** A W
28e0: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
28f0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
2900: 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e  has its u.pAndIn
2910: 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74  fo pointer set t
2920: 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c  o.** a dynamical
2930: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73  ly allocated ins
2940: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2950: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2960: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2970: 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65  eAndInfo {.  Whe
2980: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
2990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
29a0: 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65  expression broke
29b0: 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  n out */.};../*.
29c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
29d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
29e0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
29f0: 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69  track of a mappi
2a00: 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44  ng.** between VD
2a10: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2a20: 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68  s and bits of th
2a30: 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68  e bitmasks in Wh
2a40: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
2a50: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
2a60: 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c  umbers are small
2a70: 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69   integers contai
2a80: 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69  ned in .** SrcLi
2a90: 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20  st_item.iCursor 
2aa0: 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20  and Expr.iTable 
2ab0: 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79  fields.  For any
2ac0: 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a   given WHERE .**
2ad0: 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72   clause, the cur
2ae0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
2af0: 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  t not begin with
2b00: 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68   0 and they migh
2b10: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70  t.** contain gap
2b20: 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69  s in the numberi
2b30: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75  ng sequence.  Bu
2b40: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2b50: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65  e maximum.** use
2b60: 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20   of the bits in 
2b70: 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54  our bitmasks.  T
2b80: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70 72  his structure pr
2b90: 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67  ovides a mapping
2ba0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61  .** from the spa
2bb0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
2bc0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
2bd0: 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65 67  ive integers beg
2be0: 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30  inning.** with 0
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65  ..**.** If Where
2c00: 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42  MaskSet.ix[A]==B
2c10: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54   it means that T
2c20: 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61  he A-th bit of a
2c30: 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72   Bitmask.** corr
2c40: 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72  esponds VDBE cur
2c50: 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54  sor number B.  T
2c60: 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61  he A-th bit of a
2c70: 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41   bitmask is 1<<A
2c80: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
2c90: 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45 52  ple, if the WHER
2ca0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2cb0: 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20 56  ion used these V
2cc0: 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20  DBE.** cursors: 
2cd0: 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37   4, 5, 8, 29, 57
2ce0: 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20  , 73.  Then the 
2cf0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2d00: 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64  ructure.** would
2d10: 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f   map those curso
2d20: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
2d30: 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e  its 0 through 5.
2d40: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2d50: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
2d60: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2d70: 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65  ordered.  In the
2d80: 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76   example.** abov
2d90: 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d  e, the mapping m
2da0: 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69  ight go like thi
2db0: 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20  s:  4->3, 5->1, 
2dc0: 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20  8->2, 29->0,.** 
2dd0: 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f  57->5, 73->4.  O
2de0: 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68  r one of 719 oth
2df0: 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  er combinations 
2e00: 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20 49  might be used. I
2e10: 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65  t.** does not re
2e20: 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68  ally matter.  Wh
2e30: 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  at is important 
2e40: 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20 63  is that sparse c
2e50: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
2e60: 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20   all get mapped 
2e70: 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73  into bit numbers
2e80: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
2e90: 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a   0 and contain.*
2ea0: 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74  * no gaps..*/.st
2eb0: 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65  ruct WhereMaskSe
2ec0: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ef0: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
2f00: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
2f10: 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20   ix[BMS];       
2f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2f30: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
2f40: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
2f50: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f  ./*.** A WhereCo
2f60: 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64  st object record
2f70: 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74  s a lookup strat
2f80: 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74 69  egy and the esti
2f90: 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66  mated.** cost of
2fa0: 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20 73   pursuing that s
2fb0: 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75  trategy..*/.stru
2fc0: 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20  ct WhereCost {. 
2fd0: 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b   WherePlan plan;
2fe0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
2ff0: 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  p strategy */.  
3000: 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20  double rCost;   
3010: 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f     /* Overall co
3020: 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74  st of pursuing t
3030: 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61 74  his search strat
3040: 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  egy */.  Bitmask
3050: 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42   used;      /* B
3060: 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  itmask of cursor
3070: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 70  s used by this p
3080: 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lan */.};../*.**
3090: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
30a0: 61 20 66 61 63 74 6f 72 79 20 66 6f 72 20 57 68  a factory for Wh
30b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
30c0: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
30d0: 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   query..*/.struc
30e0: 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t WhereLoopBuild
30f0: 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er {.  WhereInfo
3100: 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
3110: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
3120: 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52 45  about this WHERE
3130: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3140: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3150: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3160: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 61 72 73  ection */.  Pars
3170: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
3180: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3190: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
31a0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
31b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
31c0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
31d0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
31e0: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  List;        /* 
31f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
3200: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3210: 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f 52  rBy;       /* OR
3220: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3230: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
3240: 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
3250: 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
3260: 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  op */.  WhereLoo
3270: 70 20 2a 70 42 65 73 74 3b 20 20 20 20 20 20 20  p *pBest;       
3280: 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c    /* If non-NULL
3290: 2c 20 73 74 6f 72 65 20 73 69 6e 67 6c 65 20 62  , store single b
32a0: 65 73 74 20 6c 6f 6f 70 20 68 65 72 65 20 2a 2f  est loop here */
32b0: 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 20 20  .  int mxTerm;  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32d0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
32e0: 66 20 61 54 65 72 6d 5b 5d 20 65 6e 74 72 69 65  f aTerm[] entrie
32f0: 73 20 6f 6e 20 70 4e 65 77 20 2a 2f 0a 7d 3b 0a  s on pNew */.};.
3300: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
3310: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
3320: 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 61  s that indices a
3330: 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f  re able to explo
3340: 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64  it.  An.** OR-ed
3350: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
3360: 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  these values can
3370: 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73 65   be used when se
3380: 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74  arching for.** t
3390: 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72  erms in the wher
33a0: 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65  e clause..*/.#de
33b0: 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 30  fine WO_IN     0
33c0: 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x001.#define WO_
33d0: 45 51 20 20 20 20 20 30 78 30 30 32 0a 23 64 65  EQ     0x002.#de
33e0: 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28  fine WO_LT     (
33f0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b  WO_EQ<<(TK_LT-TK
3400: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
3410: 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LE     (WO_EQ<<
3420: 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LE-TK_EQ)).#
3430: 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20  define WO_GT    
3440: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d   (WO_EQ<<(TK_GT-
3450: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
3460: 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_GE     (WO_EQ
3470: 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29  <<(TK_GE-TK_EQ))
3480: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43  .#define WO_MATC
3490: 48 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e 65  H  0x040.#define
34a0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38 30   WO_ISNULL 0x080
34b0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20 20  .#define WO_OR  
34c0: 20 20 20 30 78 31 30 30 20 20 20 20 20 20 20 2f     0x100       /
34d0: 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52  * Two or more OR
34e0: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
34f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41   */.#define WO_A
3500: 4e 44 20 20 20 20 30 78 32 30 30 20 20 20 20 20  ND    0x200     
3510: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
3520: 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74   AND-connected t
3530: 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  erms */.#define 
3540: 57 4f 5f 45 51 55 49 56 20 20 30 78 34 30 30 20  WO_EQUIV  0x400 
3550: 20 20 20 20 20 20 2f 2a 20 4f 66 20 74 68 65 20        /* Of the 
3560: 66 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74 68 20  form A==B, both 
3570: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  columns */.#defi
3580: 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38  ne WO_NOOP   0x8
3590: 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  00       /* This
35a0: 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72   term does not r
35b0: 65 73 74 72 69 63 74 20 73 65 61 72 63 68 20 73  estrict search s
35c0: 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  pace */..#define
35d0: 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66   WO_ALL    0xfff
35e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
35f0: 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57  f all possible W
3600: 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64  O_* values */.#d
3610: 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20  efine WO_SINGLE 
3620: 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0x0ff       /* M
3630: 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63  ask of all non-c
3640: 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c  ompound WO_* val
3650: 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61  ues */../*.** Va
3660: 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67 73 20  lue for wsFlags 
3670: 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73 74  returned by best
3680: 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74 6f 72  Index() and stor
3690: 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65 4c 65  ed in.** WhereLe
36a0: 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20 54 68  vel.wsFlags.  Th
36b0: 65 73 65 20 66 6c 61 67 73 20 64 65 74 65 72 6d  ese flags determ
36c0: 69 6e 65 20 77 68 69 63 68 20 73 65 61 72 63 68  ine which search
36d0: 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 61  .** strategies a
36e0: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  re appropriate..
36f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3700: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
3710: 30 30 30 30 30 30 30 31 20 20 2f 2a 20 78 3d 45  00000001  /* x=E
3720: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
3730: 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a  ) or x IS NULL *
3740: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3750: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
3760: 30 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58  0000002  /* x<EX
3770: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
3780: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
3790: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
37a0: 78 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20  x00000004  /* x 
37b0: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
37c0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
37d0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30  _NULL  0x0000000
37e0: 38 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  8  /* x IS NULL 
37f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3800: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
3810: 30 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45  00000010  /* x<E
3820: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
3830: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
3840: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
3850: 49 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30  IMIT    0x000000
3860: 32 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  20  /* x>EXPR or
3870: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
3880: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
3890: 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
38a0: 20 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a    0x00000030  /*
38b0: 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64   Both x>EXPR and
38c0: 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x<EXPR */.#defi
38d0: 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ne WHERE_IDX_ONL
38e0: 59 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30  Y     0x00000040
38f0: 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f    /* Use index o
3900: 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65  nly - omit table
3910: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
3920: 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30  E_IPK          0
3930: 78 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20  x00000100  /* x 
3940: 69 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  is the INTEGER P
3950: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64  RIMARY KEY */.#d
3960: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45  efine WHERE_INDE
3970: 58 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30  XED      0x00000
3980: 32 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f  200  /* WhereLoo
3990: 70 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  p.u.btree.pIndex
39a0: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65   is valid */.#de
39b0: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
39c0: 41 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34  ALTABLE 0x000004
39d0: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
39e0: 2e 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64  .u.vtab is valid
39f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
3a00: 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30  E_IN_ABLE      0
3a10: 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62  x00000800  /* Ab
3a20: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e  le to support an
3a30: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
3a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e  #define WHERE_UN
3a50: 49 51 55 45 20 20 20 20 20 20 20 30 78 30 30 30  IQUE       0x000
3a60: 30 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74  01000  /* Select
3a70: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
3a80: 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ne row */.#defin
3a90: 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  e WHERE_MULTI_OR
3aa0: 20 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20       0x00002000 
3ab0: 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c   /* OR using mul
3ac0: 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f  tiple indices */
3ad0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
3ae0: 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 30 30  EMP_INDEX   0x00
3af0: 30 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20  004000  /* Uses 
3b00: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
3b10: 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ex */.#define WH
3b20: 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 20 20  ERE_COVER_SCAN  
3b30: 20 30 78 30 30 30 30 38 30 30 30 20 20 2f 2a 20   0x00008000  /* 
3b40: 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 20 63  Full scan of a c
3b50: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
3b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  ../*.** This mod
3b70: 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6d 61 6e  ule contains man
3b80: 79 20 73 65 70 61 72 61 74 65 20 73 75 62 72 6f  y separate subro
3b90: 75 74 69 6e 65 73 20 74 68 61 74 20 77 6f 72 6b  utines that work
3ba0: 20 74 6f 67 65 74 68 65 72 20 74 6f 0a 2a 2a 20   together to.** 
3bb0: 66 69 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e  find the best in
3bc0: 64 69 63 65 73 20 74 6f 20 75 73 65 20 66 6f 72  dices to use for
3bd0: 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72   accessing a par
3be0: 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 6e  ticular table in
3bf0: 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20 41 6e 20   a query..** An 
3c00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3c10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3c20: 75 72 65 20 68 6f 6c 64 73 20 63 6f 6e 74 65 78  ure holds contex
3c30: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
3c40: 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  out the.** index
3c50: 20 73 65 61 72 63 68 20 73 6f 20 74 68 61 74 20   search so that 
3c60: 69 74 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65  it can be more e
3c70: 61 73 69 6c 79 20 70 61 73 73 65 64 20 62 65 74  asily passed bet
3c80: 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73  ween the various
3c90: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  .** routines..*/
3ca0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3cb0: 57 68 65 72 65 42 65 73 74 49 64 78 20 57 68 65  WhereBestIdx Whe
3cc0: 72 65 42 65 73 74 49 64 78 3b 0a 73 74 72 75 63  reBestIdx;.struc
3cd0: 74 20 57 68 65 72 65 42 65 73 74 49 64 78 20 7b  t WhereBestIdx {
3ce0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d00: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
3d10: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
3d20: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3d50: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
3d60: 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
3d70: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3d80: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
3d90: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
3da0: 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
3db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
3dc0: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74  k of cursors not
3dd0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
3de0: 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
3df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e00: 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61  /* Cursors not a
3e10: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79  vailable for any
3e20: 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78   purpose */.  Ex
3e30: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
3e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e50: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3e60: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
3e70: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 3b 20 20  st *pDistinct;  
3e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3e90: 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 66 20   select-list if 
3ea0: 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
3eb0: 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  T */.  sqlite3_i
3ec0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64  ndex_info **ppId
3ed0: 78 49 6e 66 6f 3b 20 2f 2a 20 49 6e 64 65 78 20  xInfo; /* Index 
3ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
3ef0: 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
3f00: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 20   */.  int i, n; 
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
3f30: 6f 6f 70 20 69 73 20 62 65 69 6e 67 20 63 6f 64  oop is being cod
3f40: 65 64 3b 20 23 20 6f 66 20 6c 6f 6f 70 73 20 2a  ed; # of loops *
3f50: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
3f60: 61 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  aLevel;         
3f70: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
3f80: 74 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f  t outer loops */
3f90: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 63 6f 73  .  WhereCost cos
3fa0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3fb0: 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
3fc0: 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
3fd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  };../*.** Initia
3fe0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
3ff0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
4000: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
4010: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
4020: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
4030: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
4040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
4050: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
4060: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
4070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4080: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4090: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
40a0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
40b0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a  t *pMaskSet,  /*
40c0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
40d0: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
40e0: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
40f0: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
4100: 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
4110: 4d 69 67 68 74 20 69 6e 63 6c 75 64 65 20 57 48  Might include WH
4120: 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_AND_ONLY */.
4130: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
4140: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
4150: 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61  ->pMaskSet = pMa
4160: 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 70 4f  skSet;.  pWC->pO
4170: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
4180: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
4190: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
41a0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
41b0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
41c0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
41d0: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  WC->wctrlFlags =
41e0: 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a   wctrlFlags;.}..
41f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
4200: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
4210: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
4220: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
4230: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
4240: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
4250: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4260: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
4270: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
4280: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
4290: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
42a0: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
42b0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
42c0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
42d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
42e0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
42f0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
4300: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
4310: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
4320: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
4330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
4340: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
4350: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
4360: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
4370: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
4380: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
4390: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
43a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
43b0: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
43c0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
43d0: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
43e0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
43f0: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
4400: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
4410: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
4420: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
4430: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
4440: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
4450: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
4460: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
4470: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
4480: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
4490: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
44a0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
44b0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
44c0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
44d0: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
44e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
44f0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
4500: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4510: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
4520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4530: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
4540: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
4550: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
4560: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
4570: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
4580: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
4590: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
45a0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
45b0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
45c0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
45d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
45e0: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
45f0: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
4600: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
4610: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
4620: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
4630: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
4640: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
4650: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
4660: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
4670: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
4680: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
4690: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
46a0: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
46b0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
46c0: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
46d0: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
46e0: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
46f0: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
4700: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
4710: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
4720: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
4730: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
4740: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
4750: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
4760: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
4770: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
4780: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
4790: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
47a0: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
47b0: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
47c0: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
47d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
47e0: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
47f0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4800: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
4810: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
4820: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
4830: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
4840: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
4850: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
4860: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
4870: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
4880: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
4890: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
48a0: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
48b0: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
48c0: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
48d0: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
48e0: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
48f0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
4900: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
4910: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
4920: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
4930: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
4940: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
4950: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
4960: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
4970: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
4980: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
4990: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
49a0: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
49b0: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
49c0: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
49d0: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
49e0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
49f0: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
4a00: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
4a10: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
4a20: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
4a30: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
4a40: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
4a50: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
4a60: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
4a70: 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30   );  /* EV: R-00
4a80: 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69  211-15100 */.  i
4a90: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
4aa0: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
4ab0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
4ac0: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
4ad0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
4ae0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
4af0: 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74    pWC->a = sqlit
4b00: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4b10: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
4b20: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
4b30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
4b40: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >a==0 ){.      i
4b50: 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  f( wtFlags & TER
4b60: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
4b70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4b80: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
4b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43       }.      pWC
4ba0: 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20  ->a = pOld;.    
4bb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4bc0: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43  }.    memcpy(pWC
4bd0: 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f  ->a, pOld, sizeo
4be0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
4bf0: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  ->nTerm);.    if
4c00: 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74  ( pOld!=pWC->aSt
4c10: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71  atic ){.      sq
4c20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4c30: 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pOld);.    }.   
4c40: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71   pWC->nSlot = sq
4c50: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
4c60: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69  e(db, pWC->a)/si
4c70: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b  zeof(pWC->a[0]);
4c80: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
4c90: 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43  pWC->a[idx = pWC
4ca0: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54  ->nTerm++];.  pT
4cb0: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  erm->pExpr = sql
4cc0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
4cd0: 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d  ate(p);.  pTerm-
4ce0: 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61  >wtFlags = wtFla
4cf0: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
4d00: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
4d10: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
4d20: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
4d30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4d40: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
4d50: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
4d60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4d70: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
4d80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
4d90: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
4da0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
4db0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
4dc0: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
4dd0: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
4de0: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
4df0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
4e00: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
4e10: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
4e20: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
4e30: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
4e40: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
4e50: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
4e60: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
4e70: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
4e80: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
4e90: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
4ea0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
4eb0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
4ec0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
4ed0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
4ef0: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
4f00: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
4f10: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
4f20: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
4f30: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
4f40: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
4f50: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
4f60: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
4f70: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
4f80: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
4f90: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
4fa0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
4fb0: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
4fc0: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
4fd0: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
4fe0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
4ff0: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
5000: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
5010: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
5020: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
5030: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
5040: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
5050: 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c  ic void whereSpl
5060: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
5070: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
5080: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43  , int op){.  pWC
5090: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
50a0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
50b0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
50c0: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
50d0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
50e0: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
50f0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
5100: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
5110: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
5120: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
5130: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
5140: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
5150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
5160: 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69  lize an expressi
5170: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57  on mask set (a W
5180: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
5190: 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ct).*/.#define i
51a0: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d  nitMaskSet(P)  m
51b0: 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65  emset(P, 0, size
51c0: 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52  of(*P))../*.** R
51d0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
51e0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
51f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
5200: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
5210: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
5220: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
5230: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
5240: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
5250: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
5260: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
5270: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
5280: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
5290: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
52a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
52b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
52c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
52d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
52e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
52f0: 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31  turn ((Bitmask)1
5300: 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )<<i;.    }.  }.
5310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5320: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
5330: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
5340: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
5350: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
5360: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
5370: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
5380: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
5390: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
53a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
53b0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
53c0: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
53d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
53e0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
53f0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
5400: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
5410: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
5420: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
5430: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
5440: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
5450: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
5460: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
5470: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
5480: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
5490: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
54a0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
54b0: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
54c0: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
54d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
54e0: 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75  tine walks (recu
54f0: 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72  rsively) an expr
5500: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
5510: 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62  generates.** a b
5520: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
5530: 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61  g which tables a
5540: 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20  re used in that 
5550: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
5560: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ee..**.** In ord
5570: 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  er for this rout
5580: 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65  ine to work, the
5590: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
55a0: 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70  n must have.** p
55b0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65  reviously invoke
55c0: 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  d sqlite3Resolve
55d0: 45 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74  ExprNames() on t
55e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
55f0: 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65  See.** the heade
5600: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
5610: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
5620: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
5630: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  tion..** The sql
5640: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
5650: 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20  ames() routines 
5660: 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  looks for column
5670: 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65   names and.** se
5680: 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73  ts their opcodes
5690: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
56a0: 64 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61  d their Expr.iTa
56b0: 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a  ble fields to.**
56c0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
56d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
56e0: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
56f0: 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a  ine just has to.
5700: 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65  ** translate the
5710: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
5720: 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c  into bitmask val
5730: 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a  ues and OR all.*
5740: 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74  * the bitmasks t
5750: 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  ogether..*/.stat
5760: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
5770: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
5780: 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70  ereMaskSet*, Exp
5790: 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
57a0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
57b0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
57c0: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  reMaskSet*, Sele
57d0: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
57e0: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
57f0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
5800: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
5810: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
5820: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
5830: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5840: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
5850: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
5860: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
5870: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
5880: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
5890: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
58a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
58b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
58c0: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
58d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
58e0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
58f0: 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ft);.  if( ExprH
5900: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5910: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5920: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
5930: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
5940: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
5950: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Select);.  }else
5960: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
5970: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
5980: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e  (pMaskSet, p->x.
5990: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pList);.  }.  re
59a0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
59b0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
59c0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57  ListTableUsage(W
59d0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
59e0: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
59f0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
5a00: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
5a10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
5a20: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
5a30: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
5a40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
5a50: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
5a60: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
5a70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5a90: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
5aa0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
5ab0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
5ac0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
5ad0: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
5ae0: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
5af0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69   mask = 0;.  whi
5b00: 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72  le( pS ){.    Sr
5b10: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53  cList *pSrc = pS
5b20: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b  ->pSrc;.    mask
5b30: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
5b40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5b50: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
5b60: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5b70: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5b80: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
5b90: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
5ba0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
5bb0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
5bc0: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
5bd0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
5be0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5bf0: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
5c00: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
5c10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
5c20: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
5c30: 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  );.    if( ALWAY
5c40: 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20  S(pSrc!=0) ){.  
5c50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5c60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
5c70: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
5c80: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
5c90: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
5ca0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72  ge(pMaskSet, pSr
5cb0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  c->a[i].pSelect)
5cc0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  ;.        mask |
5cd0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5ce0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d  (pMaskSet, pSrc-
5cf0: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
5d00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
5d10: 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20   = pS->pPrior;. 
5d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
5d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5d40: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
5d50: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
5d60: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
5d70: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
5d80: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
5d90: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
5da0: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
5db0: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
5dc0: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
5dd0: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
5de0: 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a  >=", and "IN"..*
5df0: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
5e00: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
5e10: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
5e20: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
5e30: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
5e40: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
5e50: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
5e60: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
5e70: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
5e80: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
5e90: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
5ea0: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
5eb0: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
5ec0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
5ed0: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
5ee0: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
5ef0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
5f00: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
5f10: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
5f20: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
5f30: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
5f40: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
5f50: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
5f60: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
5f70: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
5f80: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
5f90: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
5fa0: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
5fb0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
5fc0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
5fd0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
5fe0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
5ff0: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
6000: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
6010: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
6020: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
6030: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
6040: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
6050: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
6060: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
6070: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
6080: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
6090: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
60a0: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
60b0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
60c0: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
60d0: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
60e0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
60f0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
6100: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
6110: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
6120: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
6130: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
6140: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
6150: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
6160: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
6170: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
6180: 69 6e 67 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74  ing.** side of t
6190: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69  he comparison, i
61a0: 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69  t remains associ
61b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 61  ated with the sa
61c0: 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a  me side after.**
61d0: 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e   the commutation
61e0: 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20  . So "Y collate 
61f0: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
6200: 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 6f 70 20 59  omes .** "X op Y
6210: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
6220: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
6230: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
6240: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
6250: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
6260: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
6270: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6280: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
6290: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
62a0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
62b0: 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  on the EP_Collat
62c0: 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74  e flag.** is not
62d0: 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74   commuted..*/.st
62e0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
62f0: 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61  mmute(Parse *pPa
6300: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
6310: 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68  ){.  u16 expRigh
6320: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67  t = (pExpr->pRig
6330: 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ht->flags & EP_C
6340: 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65  ollate);.  u16 e
6350: 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d  xpLeft = (pExpr-
6360: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
6370: 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61  EP_Collate);.  a
6380: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
6390: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70  (pExpr->op) && p
63a0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20  Expr->op!=TK_IN 
63b0: 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67 68  );.  if( expRigh
63c0: 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20  t==expLeft ){.  
63d0: 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e    /* Either X an
63e0: 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f  d Y both have CO
63f0: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f  LLATE operator o
6400: 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a  r neither do */.
6410: 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68 74      if( expRight
6420: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74   ){.      /* Bot
6430: 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20 43  h X and Y have C
6440: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
6450: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69  .  Make sure X i
6460: 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a  s always.      *
6470: 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72 69  * used by cleari
6480: 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  ng the EP_Collat
6490: 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a  e flag from Y. *
64a0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
64b0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20  Right->flags &= 
64c0: 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  ~EP_Collate;.   
64d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
64e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
64f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6500: 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
6510: 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72  /* Neither X nor
6520: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
6530: 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58  operators, but X
6540: 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75   has a non-defau
6550: 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c  lt.      ** coll
6560: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
6570: 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43   So add the EP_C
6580: 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e  ollate marker on
6590: 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20   X to cause.    
65a0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65    ** it to be se
65b0: 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f  arched first. */
65c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
65d0: 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  eft->flags |= EP
65e0: 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  _Collate;.    }.
65f0: 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a    }.  SWAP(Expr*
6600: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
6610: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6620: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
6630: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
6640: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
6650: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
6660: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
6670: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
6680: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
6690: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
66a0: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
66b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
66c0: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
66d0: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
66e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
66f0: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
6700: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
6710: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
6720: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
6730: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
6740: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
6750: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
6760: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
6770: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
6780: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
6790: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
67a0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
67b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
67c0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
67d0: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
67e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
67f0: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
6800: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
6810: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
6820: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
6830: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
6840: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
6850: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
6860: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
6870: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
6880: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
6890: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
68a0: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
68b0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
68c0: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
68d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
68e0: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
68f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
6900: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
6910: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
6920: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
6930: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
6940: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn c;.}../*.** A
6950: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
6960: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
6970: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
6980: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
6990: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
69a0: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
69b0: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
69c0: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
69d0: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
69e0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
69f0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
6a00: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
6a10: 65 72 6d 73 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  erms..*/.WhereTe
6a20: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
6a30: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
6a40: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6a60: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
6a70: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
6a90: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
6aa0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
6ab0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
6ac0: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
6ad0: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
6ae0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
6af0: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
6b00: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
6b10: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
6b20: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
6b30: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
6b40: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
6b50: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
6b60: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
6b70: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
6b80: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
6b90: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
6ba0: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
6bb0: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
6bc0: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
6bd0: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
6be0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
6bf0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
6c00: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
6c10: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
6c20: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 70  r(pTerm=pWC->a+p
6c30: 53 63 61 6e 2d 3e 6b 3b 20 70 53 63 61 6e 2d 3e  Scan->k; pScan->
6c40: 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 53  k<pWC->nTerm; pS
6c50: 63 61 6e 2d 3e 6b 2b 2b 2c 20 70 54 65 72 6d 2b  can->k++, pTerm+
6c60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6c70: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6c80: 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d  r==iCur && pTerm
6c90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
6ca0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
6cb0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
6cc0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
6cd0: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
6ce0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
6cf0: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
6d00: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20  pScan->aEquiv). 
6d10: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
6d20: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
6d30: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
6d40: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
6d50: 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45  ollate(pTerm->pE
6d60: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
6d70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
6d80: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
6d90: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UMN );.         
6da0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
6db0: 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d  can->nEquiv; j+=
6dc0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
6dd0: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71    if( pScan->aEq
6de0: 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  uiv[j]==pX->iTab
6df0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
6e00: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75    && pScan->aEqu
6e10: 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f  iv[j+1]==pX->iCo
6e20: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
6e30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
6e70: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
6e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e90: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
6ea0: 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  ] = pX->iTable;.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
6ec0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
6ed0: 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pX->iColumn;.
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
6ef0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32  can->nEquiv += 2
6f00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f20: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
6f30: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53  ->eOperator & pS
6f40: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20  can->opMask)!=0 
6f50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
6f60: 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66  * Verify the aff
6f70: 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74  inity and collat
6f80: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74  ing sequence mat
6f90: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
6fa0: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f    if( pScan->zCo
6fb0: 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d  llName && (pTerm
6fc0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6fd0: 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  _ISNULL)==0 ){. 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c               Col
6ff0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
7000: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
7010: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
7020: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7030: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
7040: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61  inityOk(pX, pSca
7050: 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20  n->idxaff) ){.  
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7070: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7090: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
70a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
70b0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
70c0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
70d0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 57 43 2d 3e  areCollSeq(pWC->
70e0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
7120: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
7130: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7140: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
7150: 43 6f 6c 6c 20 3d 20 70 57 43 2d 3e 70 50 61 72  Coll = pWC->pPar
7160: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
7170: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
7180: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
7190: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
71a0: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
71b0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
71c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
71d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
71e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
71f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
7200: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7210: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
7220: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
7230: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
7240: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
7250: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
7260: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
7270: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
7280: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
7290: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
72a0: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
72b0: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
72c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
72d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
72e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
72f0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 43 75 72 72      pScan->pCurr
7300: 65 6e 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ent = pTerm;.   
7310: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
7320: 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  k++;.           
7330: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
7340: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7350: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7360: 20 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e     pWC = pScan->
7370: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
7380: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
7390: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
73a0: 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70    }.    pScan->p
73b0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69  WC = pScan->pOri
73c0: 67 57 43 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  gWC;.    pScan->
73d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
73e0: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
73f0: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 70 43 75 72   }.  pScan->pCur
7400: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  rent = 0;.  retu
7410: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
7420: 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52  nitialize a WHER
7430: 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72  E clause scanner
7440: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
7450: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7460: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
7470: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
7480: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
7490: 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atches..**.** Th
74a0: 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62  e scanner will b
74b0: 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20  e searching the 
74c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43  WHERE clause pWC
74d0: 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a  .  It will look.
74e0: 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  ** for terms of 
74f0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
7500: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58   <expr>" where X
7510: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75   is column iColu
7520: 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69  mn of table.** i
7530: 43 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d  Cur.  The <op> m
7540: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  ust be one of th
7550: 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63  e operators desc
7560: 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e  ribed by opMask.
7570: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
7580: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
7590: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
75a0: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
75b0: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
75c0: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65 72  ex pIdx..*/.Wher
75d0: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
75e0: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
75f0: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
7600: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
7610: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
7620: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
7630: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
7650: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
7660: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
7670: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
7680: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
7690: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
76a0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
76b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
76c0: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
76d0: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
76f0: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
7700: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
7710: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
7720: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
7730: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
7740: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
7750: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 6d 65 6d 73    int j;..  mems
7760: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
7770: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 0a 20 20  eof(*pScan));.  
7780: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d  pScan->pOrigWC =
7790: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
77a0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20  WC = pWC;.  if( 
77b0: 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e  pIdx && iColumn>
77c0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  =0 ){.    pScan-
77d0: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
77e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
77f0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
7800: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64      for(j=0; pId
7810: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
7820: 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  iColumn; j++){. 
7830: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
7840: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
7850: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7860: 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43   }.    pScan->zC
7870: 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e  ollName = pIdx->
7880: 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 0a 20  azColl[j];.  }. 
7890: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
78a0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
78b0: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
78c0: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
78d0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
78e0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
78f0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
7900: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
7910: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
7920: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
7930: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
7940: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
7950: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
7960: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
7970: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
7980: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
7990: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
79a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
79b0: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
79c0: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
79d0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
79e0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
79f0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
7a00: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
7a10: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
7a20: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
7a30: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
7a40: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
7a50: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
7a60: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
7a70: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
7a80: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
7a90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
7aa0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
7ab0: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
7ac0: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
7ad0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
7ae0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
7af0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
7b00: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
7b10: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
7b20: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
7b30: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
7b40: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
7b50: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
7b60: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
7b70: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
7b80: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
7b90: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
7ba0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
7bb0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
7bc0: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
7bd0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
7be0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
7bf0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
7c00: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
7c10: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
7c20: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
7c30: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
7c40: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
7c50: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
7c60: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
7c70: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
7c80: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
7c90: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
7ca0: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
7cb0: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
7cc0: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
7cd0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
7ce0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
7cf0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
7d00: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
7d10: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
7d20: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
7d30: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
7d40: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
7d50: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
7d60: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7d70: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
7d80: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
7d90: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
7da0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
7db0: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
7dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
7dd0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
7de0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
7df0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
7e00: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
7e10: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
7e20: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
7e30: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
7e40: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
7e50: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
7e60: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
7e70: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
7e80: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
7e90: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
7ea0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
7eb0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
7ec0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
7ed0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
7ee0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
7ef0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
7f00: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
7f10: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
7f20: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
7f30: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
7f40: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
7f50: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
7f60: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
7f70: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
7f90: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
7fa0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
7fb0: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
7fc0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
7fd0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
7fe0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
7ff0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
8000: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
8010: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
8020: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
8030: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
8040: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
8050: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
8060: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
8070: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
8080: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
8090: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
80a0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
80b0: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
80c0: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
80d0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
80e0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
80f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8100: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
8110: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
8120: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
8130: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
8140: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
8150: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
8160: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
8170: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
8180: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
8190: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
81a0: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
81b0: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
81c0: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
81d0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
81e0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
81f0: 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73  se.  .**.**.*/.s
8200: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
8210: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
8220: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
8230: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
8240: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
8250: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
8260: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
8270: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
8280: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
8290: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
82a0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
82b0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
82c0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
82d0: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
82e0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
82f0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
8300: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
8310: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
8320: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
8330: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
8340: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
8350: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
8360: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
8370: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
8380: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
8390: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
83a0: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
83b0: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
83c0: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
83d0: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
83e0: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
83f0: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
8400: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
8410: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
8420: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
8430: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
8440: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
8450: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8460: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
8470: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
8480: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8490: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
84a0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
84b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
84c0: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
84d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
84e0: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
84f0: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
8500: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
8510: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
8520: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
8530: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
8540: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
8550: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
8560: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
8570: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
8580: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
8590: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
85a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
85b0: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
85c0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
85d0: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
85e0: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
85f0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
8600: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
8610: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
8620: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
8630: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
8650: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
8660: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
8670: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
86a0: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
86b0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
86d0: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
86e0: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
86f0: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
8700: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
8710: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
8720: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
8730: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8740: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
8750: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
8760: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
8770: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
8780: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
87b0: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
87c0: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
87d0: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
87e0: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
87f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8800: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8810: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
8820: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
8830: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
8840: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
8850: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
8860: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
8870: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
8880: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
8890: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
88a0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
88b0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
88c0: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
88d0: 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29  pLeft->pTab).  )
88e0: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
88f0: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
8900: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
8910: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
8920: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
8930: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
8940: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
8950: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
8960: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
8970: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8980: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
8990: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
89a0: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
89b0: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
89c0: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
89d0: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
89e0: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
89f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
8a00: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
8a10: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
8a20: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
8a30: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
8a40: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
8a50: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
8a60: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
8a70: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8a80: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
8a90: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
8aa0: 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
8ab0: 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f  (pReprepare, iCo
8ac0: 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  l, SQLITE_AFF_NO
8ad0: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
8ae0: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
8af0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
8b00: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
8b10: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
8b20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8b30: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
8b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8b50: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
8b60: 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a  ->pVdbe, iCol);.
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
8b80: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  ht->op==TK_VARIA
8b90: 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  BLE || pRight->o
8ba0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
8bb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
8bc0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
8bd0: 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75     z = pRight->u
8be0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69  .zToken;.  }.  i
8bf0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20  f( z ){.    cnt 
8c00: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
8c10: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
8c20: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
8c30: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
8c40: 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ] ){.      cnt++
8c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8c60: 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28  cnt!=0 && 255!=(
8c70: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
8c80: 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66       Expr *pPref
8c90: 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f  ix;.      *pisCo
8ca0: 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30  mplete = c==wc[0
8cb0: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
8cc0: 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20  ;.      pPrefix 
8cd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
8ce0: 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b  , TK_STRING, z);
8cf0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66  .      if( pPref
8d00: 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e  ix ) pPrefix->u.
8d10: 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b  zToken[cnt] = 0;
8d20: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78  .      *ppPrefix
8d30: 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20   = pPrefix;.    
8d40: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
8d50: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  IABLE ){.       
8d60: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8d70: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
8d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8d90: 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68  Varmask(v, pRigh
8da0: 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
8db0: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
8dc0: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
8dd0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8df0: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
8e00: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
8e10: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
8e20: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
8e30: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
8e40: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
8e50: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
8e60: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
8e70: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
8e80: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
8e90: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
8ea0: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
8eb0: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
8ec0: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
8ed0: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
8ee0: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
8ef0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
8f00: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
8f10: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
8f20: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
8f30: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
8f40: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
8f50: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
8f60: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
8f70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8f80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8fa0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
8fb0: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
8fc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8fd0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
8fe0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
8ff0: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
9000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9010: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9020: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
9030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9040: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9050: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
9060: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
9070: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
9080: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
9090: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
90a0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
90b0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
90c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
90d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
90e0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
90f0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
9100: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
9110: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
9120: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
9130: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
9140: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
9150: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
9160: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
9170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9180: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
9190: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
91a0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
91b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
91c0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
91d0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
91e0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
91f0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
9200: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
9210: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
9220: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
9230: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
9240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9250: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
9260: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
9270: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
9280: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9290: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
92a0: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
92b0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
92c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
92d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
92e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
92f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9300: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
9310: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
9320: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
9330: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
9340: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
9350: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
9360: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
9370: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
9380: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
9390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
93a0: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
93b0: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
93c0: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
93d0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
93e0: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
93f0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
9400: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
9410: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
9420: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
9430: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
9440: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9450: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9460: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
9470: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
9480: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
9490: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
94a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
94b0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
94c0: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
94d0: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
94e0: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
94f0: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
9500: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
9510: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
9540: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
9550: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
9560: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
9570: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
9580: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
9590: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
95a0: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
95b0: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
95c0: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
95d0: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
95e0: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
95f0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
9600: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
9610: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
9620: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
9630: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
9640: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
9650: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
9660: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
9670: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
9680: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
9690: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
96a0: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
96b0: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
96c0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
96d0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
96e0: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
96f0: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
9700: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
9710: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
9720: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
9730: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
9740: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
9750: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
9760: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
9770: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
9780: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
9790: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
97a0: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
97b0: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
97c0: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
97d0: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
97e0: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
97f0: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
9800: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
9810: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
9820: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
9830: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
9840: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
9850: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
9860: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
9870: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
9880: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
9890: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
98a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
98b0: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
98c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
98d0: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
98e0: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
98f0: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
9900: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
9910: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
9920: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
9930: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
9940: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
9950: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
9960: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
9970: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
9980: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
9990: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
99a0: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
99b0: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
99c0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
99d0: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
99e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
99f0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
9a00: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
9a10: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
9a20: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
9a30: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
9a40: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
9a50: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
9a60: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
9a70: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
9a80: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
9a90: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
9aa0: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
9ab0: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
9ac0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
9ad0: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
9ae0: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
9af0: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
9b00: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
9b10: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
9b20: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
9b30: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
9b40: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
9b50: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
9b60: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
9b70: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
9b80: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
9b90: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
9ba0: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
9bb0: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
9bc0: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
9bd0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
9be0: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
9bf0: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
9c00: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
9c10: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
9c20: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
9c30: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
9c40: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
9c50: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
9c60: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
9c70: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
9c80: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
9c90: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
9ca0: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
9cb0: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
9cc0: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
9cd0: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
9ce0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
9cf0: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
9d00: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
9d10: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
9d20: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
9d30: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
9d40: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
9d50: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
9d60: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
9d70: 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f  e bestIndex() ro
9d80: 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72  utine will deter
9d90: 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  mine.  This anal
9da0: 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f  ysis.** only loo
9db0: 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75  ks at whether su
9dc0: 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61  bterms appropria
9dd0: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
9de0: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
9df0: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
9e00: 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20  ugh E above all 
9e10: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
9e20: 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a   But if a term.*
9e30: 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65  * also statisfie
9e40: 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61  s case 1 (such a
9e50: 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61  s B) we know tha
9e60: 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
9e70: 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70  will.** always p
9e80: 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f  refer case 1, so
9e90: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   in that case we
9ea0: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61   pretend that ca
9eb0: 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  se 2 is not.** s
9ec0: 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  atisfied..**.** 
9ed0: 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  It might be the 
9ee0: 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70  case that multip
9ef0: 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e  le tables are in
9f00: 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78  dexable.  For ex
9f10: 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62  ample,.** (E) ab
9f20: 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ove is indexable
9f30: 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c   on tables P, Q,
9f40: 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65   and R..**.** Te
9f50: 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79  rms that satisfy
9f60: 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64   case 2 are cand
9f70: 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75  idates for looku
9f80: 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65  p by using.** se
9f90: 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74  parate indices t
9fa0: 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f  o find rowids fo
9fb0: 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61  r each subterm a
9fc0: 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20  nd composing.** 
9fd0: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c  the union of all
9fe0: 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20   rowids using a 
9ff0: 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  RowSet object.  
a000: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a  This is similar.
a010: 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e  ** to "bitmap in
a020: 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20  dices" in other 
a030: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73  database engines
a040: 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53  ..**.** OTHERWIS
a050: 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  E:.**.** If neit
a060: 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63  her case 1 nor c
a070: 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65  ase 2 apply, the
a080: 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65  n leave the eOpe
a090: 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20  rator set to.** 
a0a0: 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d  zero.  This term
a0b0: 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
a0c0: 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74  or search..*/.st
a0d0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
a0e0: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53  alyzeOrTerm(.  S
a0f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
a100: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a110: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a120: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a130: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
a140: 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45  e complete WHERE
a150: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a160: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
a170: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a180: 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74  of the OR-term t
a190: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a1a0: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
a1b0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
a1c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a1d0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
a1e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a1f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a210: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
a220: 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
a230: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
a240: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20  ->a[idxTerm];   
a250: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
a260: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
a270: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
a280: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20  Term->pExpr;    
a290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a2a0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
a2b0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  e term */.  Wher
a2c0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
a2d0: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
a2e0: 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65  et; /* Table use
a2f0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   masks */.  int 
a300: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a330: 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
a340: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
a350: 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f      /* Breakup o
a360: 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62  f pTerm into sub
a370: 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
a380: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20  Term *pOrTerm;  
a390: 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65       /* A Sub-te
a3a0: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f  rm within the pO
a3b0: 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  rWc */.  WhereOr
a3c0: 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20  Info *pOrInfo;  
a3d0: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
a3e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73   information ass
a3f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65  ociated with pTe
a400: 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  rm */.  Bitmask 
a410: 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20  chngToIN;       
a420: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
a430: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
a440: 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61  ase 1 */.  Bitma
a450: 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  sk indexable;   
a460: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
a470: 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c  hat are indexabl
a480: 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61  e, satisfying ca
a490: 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  se 2 */..  /*.  
a4a0: 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20  ** Break the OR 
a4b0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20  clause into its 
a4c0: 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d  separate subterm
a4d0: 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73  s.  The subterms
a4e0: 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64   are.  ** stored
a4f0: 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73   in a WhereClaus
a500: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
a510: 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68  aining within th
a520: 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20  e WhereOrInfo.  
a530: 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
a540: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
a550: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c  e original OR cl
a560: 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a  ause term..  */.
a570: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
a580: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
a590: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f  M_DYNAMIC|TERM_O
a5a0: 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e  RINFO|TERM_ANDIN
a5b0: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  FO))==0 );.  ass
a5c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
a5d0: 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d  TK_OR );.  pTerm
a5e0: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f  ->u.pOrInfo = pO
a5f0: 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  rInfo = sqlite3D
a600: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
a610: 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29  sizeof(*pOrInfo)
a620: 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f  );.  if( pOrInfo
a630: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a640: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
a650: 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20  = TERM_ORINFO;. 
a660: 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66   pOrWc = &pOrInf
a670: 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c  o->wc;.  whereCl
a680: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
a690: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
a6a0: 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72  skSet, pWC->wctr
a6b0: 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65  lFlags);.  where
a6c0: 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78  Split(pOrWc, pEx
a6d0: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78  pr, TK_OR);.  ex
a6e0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
a6f0: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
a700: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a710: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
a720: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
a730: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
a740: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
a750: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
a760: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
a770: 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20   cases 1 or 2.. 
a780: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
a790: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
a7a0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
a7b0: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
a7c0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
a7d0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
a7e0: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
a7f0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
a800: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
a810: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
a820: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
a830: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
a840: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
a850: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
a860: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
a870: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
a880: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
a890: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
a8a0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
a8b0: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
a8c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
a8d0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64  db, sizeof(*pAnd
a8e0: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
a8f0: 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20  ( pAndInfo ){.  
a900: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
a910: 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20  e *pAndWC;.     
a920: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
a930: 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  ndTerm;.        
a940: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42  int j;.        B
a950: 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20  itmask b = 0;.  
a960: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75        pOrTerm->u
a970: 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64  .pAndInfo = pAnd
a980: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f  Info;.        pO
a990: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
a9a0: 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a  = TERM_ANDINFO;.
a9b0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
a9c0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
a9d0: 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  AND;.        pAn
a9e0: 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d  dWC = &pAndInfo-
a9f0: 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65  >wc;.        whe
aa00: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e  reClauseInit(pAn
aa10: 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  dWC, pWC->pParse
aa20: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
aa30: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
aa40: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
aa50: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
aa60: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
aa70: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
aa80: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
aa90: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
aaa0: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
aab0: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
aac0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
aad0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
aae0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
aaf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
ab00: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
ab10: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
ab20: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
ab30: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
ab40: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
ab50: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
ab60: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
ab70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
ab80: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
ab90: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
abb0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
abc0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
abd0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
abe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
abf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ac00: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
ac10: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
ac20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
ac30: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
ac40: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
ac50: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
ac60: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
ac70: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
ac80: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
ac90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
acb0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
acc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acd0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
ace0: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
acf0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
ad00: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
ad10: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
ad20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ad30: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
ad40: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
ad50: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
ad60: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
ad70: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
ad80: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
ad90: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
ada0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
adb0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
adc0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
add0: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
ade0: 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
adf0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  ){.        chngT
ae00: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  oIN = 0;.      }
ae10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
ae20: 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20  ngToIN &= b;.   
ae30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ae40: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64    /*.  ** Record
ae50: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
ae60: 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  es that satisfy 
ae70: 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74  case 2.  The set
ae80: 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65   might be.  ** e
ae90: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  mpty..  */.  pOr
aea0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
aeb0: 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70  = indexable;.  p
aec0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
aed0: 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f  = indexable==0 ?
aee0: 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f   0 : WO_OR;..  /
aef0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
af00: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
af10: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
af20: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
af30: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
af40: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
af50: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
af60: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
af70: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
af80: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
af90: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
afa0: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
afb0: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
afc0: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
afd0: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
afe0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
aff0: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
b000: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
b010: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
b020: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
b030: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
b040: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
b050: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
b060: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
b070: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
b080: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
b090: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
b0a0: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
b0b0: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
b0c0: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
b0d0: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
b0e0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
b0f0: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
b100: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
b110: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
b120: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
b130: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
b140: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
b150: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
b160: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
b170: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
b180: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
b190: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
b1a0: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
b1b0: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
b1c0: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
b1d0: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
b1e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
b1f0: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
b200: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
b210: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
b220: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
b230: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
b240: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
b250: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
b260: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
b270: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
b280: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
b290: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
b2a0: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
b2b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
b2c0: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
b2d0: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
b2e0: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
b2f0: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
b300: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
b310: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
b320: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
b330: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
b340: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
b350: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
b360: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
b370: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
b380: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
b390: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
b3a0: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
b3b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
b3c0: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
b3d0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
b3e0: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
b3f0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
b400: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
b410: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
b420: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
b430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b440: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b450: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
b460: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
b470: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
b480: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
b490: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
b4a0: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
b4b0: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
b4c0: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
b4d0: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
b4e0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
b4f0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
b500: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
b510: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
b520: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
b530: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
b540: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
b550: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
b560: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
b570: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
b580: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
b590: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
b5a0: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
b5b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
b5c0: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
b5d0: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
b5e0: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
b5f0: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
b600: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
b610: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
b620: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
b630: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
b640: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b650: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
b660: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
b670: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
b680: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
b690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
b6a0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
b6b0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
b6c0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
b6d0: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
b6e0: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
b6f0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
b700: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
b710: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
b720: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
b730: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
b740: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
b750: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
b760: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
b770: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b780: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
b790: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
b7a0: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
b7b0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
b7c0: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
b7d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
b7e0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
b7f0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
b800: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
b810: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
b820: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
b830: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
b840: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
b850: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
b860: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
b870: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
b880: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
b890: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
b8a0: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
b8b0: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
b8c0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
b8d0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
b8e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b8f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
b900: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
b910: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
b920: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
b930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
b940: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
b950: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
b960: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
b970: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
b980: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
b990: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b9a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b9b0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
b9c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
b9d0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
b9e0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
b9f0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
ba00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ba10: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
ba20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
ba30: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
ba40: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
ba50: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
ba60: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
ba70: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
ba80: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
ba90: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
baa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
bab0: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
bac0: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
bad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
bae0: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
baf0: 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f  pMaskSet, iCurso
bb00: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  r) );.        br
bb10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bb20: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
bb30: 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
bb40: 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63  e have found a c
bb50: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61  andidate table a
bb60: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63  nd column.  Chec
bb70: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  k to see if that
bb80: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
bb90: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f  and column is co
bba0: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
bbb0: 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  rm in the OR cla
bbc0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54  use */.      okT
bbd0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20  oChngToIN = 1;. 
bbe0: 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20       for(; i>=0 
bbf0: 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  && okToChngToIN;
bc00: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
bc10: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
bc20: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
bc30: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
bc40: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
bc50: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
bc60: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
bc70: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
bc80: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
bc90: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
bca0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
bcb0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  ->u.leftColumn!=
bcc0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
bcd0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
bce0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  N = 0;.        }
bcf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bd00: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
bd10: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
bd20: 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74   /* If the right
bd30: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
bd40: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
bd50: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
bd60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
bd70: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
bd80: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
bd90: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
bda0: 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a  type.          *
bdb0: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  * conversions ar
bdc0: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
bdd0: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
bde0: 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20  t #2249).       
bdf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
be00: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
be10: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
be20: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
be30: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
be40: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
be50: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
be60: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
be70: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
be80: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d    if( affRight!=
be90: 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61  0 && affRight!=a
bea0: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  ffLeft ){.      
beb0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
bec0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
bed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bee0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
bef0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
bf00: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
bf10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf20: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
bf30: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
bf40: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20  okToChngToIN is 
bf50: 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c  true if original
bf60: 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73   pTerm satisfies
bf70: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20  .    ** case 1. 
bf80: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63   In that case, c
bf90: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76  onstruct a new v
bfa0: 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74  irtual term that
bfb0: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72   is .    ** pTer
bfc0: 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  m converted into
bfd0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
bfe0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
bff0: 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30  V: R-00211-15100
c000: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c010: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a  okToChngToIN ){.
c020: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
c030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c040: 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c  A transient dupl
c050: 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  icate expression
c060: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
c070: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  st *pList = 0;  
c080: 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74   /* The RHS of t
c090: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
c0a0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
c0b0: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
c0c0: 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
c0d0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
c0e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
c0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c100: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20  The complete IN 
c110: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
c120: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
c130: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
c140: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b  =pOrWc->a; i>=0;
c150: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
c160: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
c170: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c180: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
c190: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
c1b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c1c0: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
c1d0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
c1e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
c1f0: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
c200: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
c210: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
c220: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
c230: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
c240: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c250: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
c260: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
c270: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c280: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c290: 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c  (pWC->pParse, pL
c2a0: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
c2b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
c2c0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
c2d0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
c2e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
c2f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
c300: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c310: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
c320: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
c330: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c340: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
c350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
c360: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
c370: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
c380: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
c390: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
c3a0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
c3b0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
c3c0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
c3d0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
c3e0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
c3f0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
c400: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
c410: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
c420: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
c430: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c440: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
c450: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
c460: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
c470: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
c480: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
c490: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
c4a0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c4b0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
c4c0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
c4d0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c4e0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c4f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
c500: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
c510: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
c520: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
c530: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
c540: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c550: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
c560: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
c570: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
c580: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
c590: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
c5a0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
c5b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
c5c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
c5d0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
c5e0: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
c5f0: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
c600: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
c610: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
c620: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
c630: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
c640: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
c650: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
c660: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
c670: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
c680: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
c690: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
c6a0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
c6b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
c6c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
c6d0: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
c6e0: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
c6f0: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
c700: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
c710: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
c720: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c730: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
c740: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
c750: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
c760: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
c770: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
c780: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
c790: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
c7a0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
c7b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
c7c0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
c7d0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
c7e0: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
c7f0: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
c800: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
c810: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
c820: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
c830: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
c840: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
c850: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
c860: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
c870: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
c880: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
c890: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
c8a0: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
c8b0: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
c8c0: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
c8d0: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
c8e0: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
c8f0: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
c900: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
c910: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
c920: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
c930: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
c940: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
c950: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
c960: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
c970: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
c980: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
c990: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
c9a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
c9b0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
c9c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
c9d0: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
c9e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
c9f0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
ca00: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
ca10: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
ca20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
ca30: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
ca40: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
ca50: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
ca60: 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20  pMaskSet;       
ca70: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62     /* Set of tab
ca80: 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a  le index masks *
ca90: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  /.  Expr *pExpr;
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
cac0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
cad0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
cae0: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20  sk prereqLeft;  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
cb00: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
cb10: 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
cb20: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
cb30: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20  ereqAll;        
cb40: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
cb50: 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72  uesites of pExpr
cb60: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
cb70: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20  traRight = 0;   
cb80: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
cb90: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
cba0: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45  LEFT JOIN */.  E
cbb0: 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20  xpr *pStr1 = 0; 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
cbe0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
cbf0: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
cc00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cc10: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
cc20: 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68  E/GLOB ends with
cc30: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69   wildcard */.  i
cc40: 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20  nt noCase = 0;  
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73  /* LIKE/GLOB dis
cc70: 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20  tinguishes case 
cc80: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76        /* Top-lev
ccb0: 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45  el operator.  pE
ccc0: 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72  xpr->op */.  Par
ccd0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
cce0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
ccf0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
cd00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
cd10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
cd20: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cd30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
cd40: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
cd50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
cd60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
cd70: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
cd80: 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53  xTerm];.  pMaskS
cd90: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
cda0: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
cdb0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73  erm->pExpr;.  as
cdc0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
cdd0: 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d  =TK_AS && pExpr-
cde0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op!=TK_COLLATE 
cdf0: 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  );.  prereqLeft 
ce00: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ce10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ce20: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d  ->pLeft);.  op =
ce30: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
ce40: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
ce50: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ce60: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
ce70: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
ce80: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
ce90: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
cea0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
ceb0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65  eqRight = exprSe
cec0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
ced0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
cee0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
cef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
cf00: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
cf10: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
cf20: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
cf30: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
cf40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
cf50: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
cf60: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  ){.    pTerm->pr
cf70: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
cf80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72   }else{.    pTer
cf90: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
cfa0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
cfb0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
cfc0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
cfd0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72  prereqAll = expr
cfe0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
cff0: 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  Set, pExpr);.  i
d000: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
d010: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
d020: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69  mJoin) ){.    Bi
d030: 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73  tmask x = getMas
d040: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
d050: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
d060: 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41  le);.    prereqA
d070: 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74  ll |= x;.    ext
d080: 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20  raRight = x-1;  
d090: 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  /* ON clause ter
d0a0: 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ms may not be us
d0b0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
d0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65          ** on le
d0e0: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ft table of a LE
d0f0: 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74  FT JOIN.  Ticket
d100: 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20   #3015 */.  }.  
d110: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
d120: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
d130: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d140: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
d150: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
d160: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
d170: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
d180: 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20  owedOp(op) ){.  
d190: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
d1a0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
d1b0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c  ollate(pExpr->pL
d1c0: 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a  eft);.    Expr *
d1d0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
d1e0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
d1f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
d200: 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d      u16 opMask =
d210: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
d220: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
d230: 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a  t)==0 ? WO_ALL :
d240: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69   WO_EQUIV;.    i
d250: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
d260: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
d270: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
d280: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
d290: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
d2a0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
d2b0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
d2c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
d2d0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
d2e0: 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61  rMask(op) & opMa
d2f0: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sk;.    }.    if
d300: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
d310: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
d320: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
d330: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
d340: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
d350: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70      u16 eExtraOp
d360: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
d370: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70  Extra bits for p
d380: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  New->eOperator *
d390: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  /.      if( pTer
d3a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
d3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
d3c0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
d3d0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
d3e0: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
d3f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
d400: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d410: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
d420: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d430: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
d440: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
d450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d460: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
d470: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
d480: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
d490: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
d4a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
d4b0: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
d4c0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
d4d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
d4e0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
d4f0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
d500: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
d510: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
d520: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
d530: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
d540: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
d550: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
d560: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69  OPIED;.        i
d570: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
d580: 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20  _EQ.         && 
d590: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
d5a0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
d5b0: 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26  oin).         &&
d5c0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
d5d0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
d5e0: 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20  Transitive).    
d5f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d600: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
d610: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  r |= WO_EQUIV;. 
d620: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f           eExtraO
d630: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  p = WO_EQUIV;.  
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d650: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
d660: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
d670: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
d680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
d690: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
d6a0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
d6b0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
d6c0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
d6d0: 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  Dup->pLeft);.   
d6e0: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
d6f0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
d700: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
d710: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
d720: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
d730: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d740: 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78  (prereqLeft | ex
d750: 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65  traRight) != pre
d760: 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  reqLeft );.     
d770: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
d780: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ht = prereqLeft 
d790: 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20  | extraRight;.  
d7a0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
d7b0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
d7c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
d7d0: 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74  erator = (operat
d7e0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
d7f0: 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f   + eExtraOp) & o
d800: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMask;.    }.  }
d810: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d820: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
d830: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
d840: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
d850: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
d860: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
d870: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
d880: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
d890: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
d8a0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
d8b0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
d8c0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
d8d0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
d8e0: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
d8f0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
d900: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
d910: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
d920: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
d930: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
d940: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
d950: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
d960: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d970: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
d980: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
d990: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
d9a0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
d9b0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
d9c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
d9d0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
d9e0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
d9f0: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
da00: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
da10: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
da20: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
da30: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
da40: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
da50: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
da60: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
da70: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
da80: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
da90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
daa0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
dab0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
dac0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
dad0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
dae0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
daf0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
db00: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
db10: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
db20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
db30: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
db40: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
db50: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
db60: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
db70: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
db80: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
db90: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
dba0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
dbb0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
dbc0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
dbf0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
dc00: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dc30: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
dc40: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
dc50: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
dc60: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
dc70: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
dc80: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
dc90: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
dca0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcb0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
dcc0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
dcd0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
dce0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
dcf0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
dd00: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
dd10: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
dd20: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
dd30: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
dd40: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
dd50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
dd60: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
dd70: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
dd80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dd90: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
dda0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
ddb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ddc0: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
ddd0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
dde0: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
ddf0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
de00: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
de10: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
de20: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
de30: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
de40: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
de50: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
de60: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
de70: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
de80: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
de90: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
dea0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
deb0: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
dec0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
ded0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
dee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
def0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
df00: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
df10: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
df20: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
df30: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
df40: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
df50: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
df60: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
df70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
df80: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
df90: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
dfa0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
dfb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
dfc0: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
dfd0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
dfe0: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
dff0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
e000: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
e010: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
e020: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
e030: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
e040: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
e050: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
e060: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
e070: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
e080: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
e090: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
e0a0: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
e0b0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
e0c0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
e0d0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
e0e0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
e0f0: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
e100: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
e110: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
e120: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
e130: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
e140: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
e150: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
e160: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
e170: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
e180: 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61  Token sCollSeqNa
e190: 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
e1a0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e1b0: 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  ce */..    pLeft
e1c0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
e1d0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
e1e0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
e1f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
e200: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
e210: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e220: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
e230: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
e240: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
e250: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
e260: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
e270: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
e280: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
e290: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
e2a0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
e2b0: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
e2c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
e2d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e2e0: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
e2f0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
e300: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
e310: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
e320: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
e330: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
e340: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
e350: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
e360: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
e370: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
e380: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
e390: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
e3a0: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
e3b0: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
e3c0: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
e3d0: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
e3e0: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
e3f0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
e400: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
e410: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
e420: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
e430: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
e440: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e450: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
e460: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
e470: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
e480: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
e490: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
e4a0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
e4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e4c0: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
e4d0: 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e   }.    sCollSeqN
e4e0: 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f  ame.z = noCase ?
e4f0: 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e   "NOCASE" : "BIN
e500: 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53  ARY";.    sCollS
e510: 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20  eqName.n = 6;.  
e520: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
e530: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
e540: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
e550: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
e560: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
e570: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
e580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e590: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
e5a0: 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c  Parse,pNewExpr1,
e5b0: 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
e5c0: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
e5d0: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
e5e0: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
e5f0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
e600: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
e610: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
e620: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
e630: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
e640: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
e650: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
e660: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
e670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e680: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e690: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
e6a0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
e6b0: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
e6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e6d0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
e6e0: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
e6f0: 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr2,&sCollSeqNam
e700: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
e710: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
e720: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
e730: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
e740: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
e750: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
e760: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
e770: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
e780: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
e790: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
e7a0: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
e7b0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
e7c0: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
e7d0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
e7e0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
e7f0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
e800: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
e810: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
e820: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e830: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
e840: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
e850: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e860: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
e870: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
e880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e890: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
e8a0: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
e8b0: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
e8c0: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
e8d0: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
e8e0: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
e8f0: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
e900: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
e910: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
e920: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e930: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
e940: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
e950: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
e960: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
e970: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
e980: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
e990: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
e9a0: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
e9b0: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
e9c0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
e9d0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
e9e0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
e9f0: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
ea00: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
ea10: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
ea20: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
ea30: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
ea40: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
ea50: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
ea60: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
ea70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
ea80: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
ea90: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
eaa0: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
eab0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
eac0: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
ead0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
eae0: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
eaf0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
eb00: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
eb10: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
eb20: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
eb30: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
eb40: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
eb50: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
eb60: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
eb70: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
eba0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
ebb0: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
ebc0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
ebd0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
ebe0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
ebf0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
ec00: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
ec10: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
ec20: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
ec30: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
ec40: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
ec50: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
ec60: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
ec70: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
ec80: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
ec90: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
eca0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
ecb0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
ecc0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
ecd0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
ece0: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
ecf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ed00: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
ed10: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
ed20: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
ed30: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
ed40: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ed50: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
ed60: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
ed70: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
ed80: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
ed90: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
eda0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
edb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
edc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
edd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ede0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f  ENABLE_STAT3.  /
edf0: 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
ee00: 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
ee10: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
ee20: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
ee30: 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
ee40: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
ee50: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
ee60: 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
ee70: 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
ee80: 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
ee90: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
eea0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
eeb0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
eec0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
eed0: 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
eee0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
eef0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
ef00: 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
ef10: 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
ef20: 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
ef30: 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
ef40: 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
ef50: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
ef60: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
ef70: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
ef80: 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
ef90: 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
efa0: 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
efb0: 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
efc0: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
efd0: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
efe0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
eff0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
f000: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
f010: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
f020: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
f030: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
f040: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
f050: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
f060: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
f070: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
f080: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
f090: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
f0a0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
f0b0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
f0c0: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
f0d0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
f0e0: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f110: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
f120: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
f150: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c  (pParse, TK_NULL
f160: 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a  , 0, 0, 0), 0);.
f170: 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68  .    idxNew = wh
f180: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
f190: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52               TER
f1c0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
f1d0: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c  YNAMIC|TERM_VNUL
f1e0: 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e  L);.    if( idxN
f1f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
f200: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
f210: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
f220: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
f230: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ght = 0;.      p
f240: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
f250: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
f260: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
f270: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
f280: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
f290: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
f2a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
f2b0: 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65  WO_GT;.      pNe
f2c0: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
f2d0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
f2e0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
f2f0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
f300: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
f310: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
f320: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
f330: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
f340: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
f350: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
f360: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
f370: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f380: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a  _ENABLE_STAT */.
f390: 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e  .  /* Prevent ON
f3a0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
f3b0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f   a LEFT JOIN fro
f3c0: 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  m being used to 
f3d0: 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  drive.  ** an in
f3e0: 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74  dex for tables t
f3f0: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
f400: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e join..  */.  p
f410: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
f420: 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b  t |= extraRight;
f430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
f440: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
f450: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f460: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
f470: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f480: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70  nt.** for an exp
f490: 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20  ression of type 
f4a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
f4b0: 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d  efers to the sam
f4c0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20  e column and.** 
f4d0: 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  uses the same co
f4e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f4f0: 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20   as the iCol'th 
f500: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
f510: 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e  pIdx..** Argumen
f520: 74 20 69 42 61 73 65 20 69 73 20 74 68 65 20 63  t iBase is the c
f530: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65  ursor number use
f540: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
f550: 74 68 61 74 20 70 49 64 78 20 72 65 66 65 72 73  that pIdx refers
f560: 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  .** to..**.** If
f570: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
f580: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
f590: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
f5a0: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
f5b0: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
f5c0: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
f5d0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
f5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
f5f0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
f600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f620: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
f630: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f640: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
f650: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
f660: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
f670: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
f680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f690: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
f6a0: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
f6b0: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
f6c0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
f6d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
f6f0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
f700: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
f730: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
f740: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
f750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f760: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
f770: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
f780: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f790: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f7a0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
f7b0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
f7c0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
f7d0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
f7e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
f7f0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
f800: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
f810: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
f820: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
f830: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
f840: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
f850: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f860: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
f870: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f880: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
f890: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
f8a0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
f8b0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
f8c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f8d0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
f8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
f8f0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
f900: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
f910: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
f920: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
f930: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
f940: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
f950: 75 6e 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e  undant. A DISTIN
f960: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
f970: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
f980: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a  base contains a.
f990: 2a 2a 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  ** UNIQUE index 
f9a0: 74 68 61 74 20 67 75 61 72 61 6e 74 65 65 73 20  that guarantees 
f9b0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
f9c0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 77 69 6c  of the query wil
f9d0: 6c 20 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a  l be distinct.**
f9e0: 20 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74   anyway..*/.stat
f9f0: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
fa00: 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61  tRedundant(.  Pa
fa10: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53  rse *pParse,.  S
fa20: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
fa30: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
fa40: 2a 70 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74  *pWC,.  ExprList
fa50: 20 2a 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20   *pDistinct.){. 
fa60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
fa70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
fa80: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
faa0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
fab0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
fac0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
fad0: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
fae0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
faf0: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
fb00: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
fb10: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
fb20: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
fb30: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
fb40: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
fb50: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
fb60: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
fb70: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
fb80: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
fb90: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
fba0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
fbb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
fbc0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
fbd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
fbe0: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
fbf0: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
fc00: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
fc10: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
fc20: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
fc30: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
fc40: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
fc50: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
fc60: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
fc70: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
fc80: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
fc90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
fca0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
fcb0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
fcc0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
fcd0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
fce0: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
fcf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
fd00: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
fd10: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
fd20: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
fd30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
fd40: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
fd50: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
fd60: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
fd70: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
fd80: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
fd90: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
fda0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
fdb0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
fdc0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
fdd0: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
fde0: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
fdf0: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
fe00: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
fe10: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
fe20: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
fe30: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
fe40: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
fe50: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
fe60: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
fe70: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
fe80: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
fe90: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
fea0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
feb0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
fec0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
fed0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
fee0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
fef0: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
ff00: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
ff10: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
ff20: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
ff30: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
ff40: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
ff50: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
ff60: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
ff70: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
ff80: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
ff90: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
ffa0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
ffb0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
ffc0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
ffd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ffe0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
fff0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
10000 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
10010 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
10020 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
10030 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
10040 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
10050 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
10060 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
10070 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
10080 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
10090 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
100a0 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
100b0 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
100c0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
100d0 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
100e0 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
100f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
10100 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
10110 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
10120 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
10130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10140 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10150 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10160 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
10170 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
10180 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
10190 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
101a0 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
101b0 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
101c0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
101d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
101e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
101f0 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
10200 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
10210 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
10220 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
10230 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
10240 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
10250 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
10260 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
10270 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
10280 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
10290 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  orming operation
102a0 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
102b0 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
102c0 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
102d0 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
102e0 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
102f0 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
10300 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
10310 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
10320 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
10330 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
10340 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20  uble logN = 1;. 
10350 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a   double x = 10;.
10360 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
10370 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20      logN += 1;. 
10380 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a     x *= 10;.  }.
10390 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d    return logN;.}
103a0 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
103b0 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
103c0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
103d0 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
103e0 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
103f0 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
10400 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
10410 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
10420 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
10430 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
10440 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
10450 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
10460 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
10470 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
10480 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10490 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
104a0 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
104b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
104c0 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
104d0 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
104e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
104f0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
10500 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
10510 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
10520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
10530 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10540 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10550 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
10560 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
10570 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
10580 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
10590 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
105a0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
105b0 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
105c0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
105d0 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
105e0 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
105f0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
10600 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10610 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
10620 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
10630 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
10640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10650 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10660 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
10670 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
10680 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
10690 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
106a0 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
106b0 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
106c0 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
106d0 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
106e0 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
106f0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
10700 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
10710 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
10720 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
10730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
10740 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10760 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
10770 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
10780 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
10790 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
107a0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
107b0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
107c0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
107d0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
107e0 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
107f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10800 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
10810 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
10820 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10830 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
10840 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
10850 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10860 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
10870 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
10880 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
10890 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
108a0 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
108b0 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
108c0 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
108d0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
108e0 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
108f0 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
10900 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
10910 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
10920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10930 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
10940 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10950 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
10960 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
10970 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
10980 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
10990 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
109a0 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
109b0 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
109c0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
109d0 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
109e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
109f0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
10a00 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10a10 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
10a20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
10a30 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
10a40 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
10a50 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
10a60 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
10a70 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
10a80 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
10a90 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
10aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
10ab0 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
10ac0 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
10ad0 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
10ae0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
10af0 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
10b00 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
10b10 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
10b20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10b30 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
10b40 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
10b50 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
10b60 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
10b70 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
10b80 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
10b90 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
10ba0 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
10bb0 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
10bc0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
10bd0 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
10be0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
10bf0 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
10c00 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
10c10 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
10c20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
10c30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10c40 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
10c50 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10c60 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
10c70 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
10c80 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
10c90 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
10ca0 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
10cb0 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
10cc0 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
10cd0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
10ce0 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
10cf0 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
10d00 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
10d10 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
10d20 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
10d30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d50 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10d60 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
10d70 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
10d80 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
10d90 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
10da0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
10db0 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
10dc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
10dd0 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
10de0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
10df0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
10e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10e10 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
10e20 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
10e30 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
10e40 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
10e50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
10e60 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
10e70 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10ea0 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
10eb0 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
10ec0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10ed0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
10ee0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
10ef0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
10f00 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
10f10 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
10f20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
10f30 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
10f40 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
10f50 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
10f60 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
10f70 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
10f80 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
10f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10fa0 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
10fb0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
10fc0 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
10fd0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10fe0 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
10ff0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
11000 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11010 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
11020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11040 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
11050 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
11060 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11080 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
11090 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
110a0 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
110b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
110c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
110d0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
110e0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11100 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
11110 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
11120 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11140 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
11150 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
11160 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
11190 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
111c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
111d0 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
111e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
111f0 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
11200 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
11210 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
11220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11230 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11240 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
11250 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
11260 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
11270 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
11280 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
11290 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
112a0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
112b0 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
112c0 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
112d0 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
112e0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
112f0 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
11300 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
11310 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
11320 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
11330 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
11340 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
11350 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
11360 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
11370 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
11380 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
11390 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
113a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
113b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
113c0 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
113d0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
113e0 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
113f0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
11400 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
11410 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
11420 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
11430 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
11440 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
11450 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
11460 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
11470 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
11480 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
11490 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
114a0 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
114b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
114c0 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
114d0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
114e0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
114f0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
11500 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
11510 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
11520 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
11530 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
11540 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
11550 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
11560 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
11570 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
11580 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
11590 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
115a0 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
115b0 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
115c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
115d0 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
115e0 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
115f0 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
11600 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
11610 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  ++;.        idxC
11620 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
11630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11640 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
11650 6e 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  n>0 );.  pLoop->
11660 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6e 43  u.btree.nEq = nC
11670 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75  olumn;..  /* Cou
11680 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
11690 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
116a0 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
116b0 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
116c0 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
116d0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
116e0 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
116f0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
11700 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
11710 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
11720 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
11730 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
11740 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
11750 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
11760 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
11770 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
11780 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
11790 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
117a0 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
117b0 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
117c0 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
117d0 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
117e0 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
117f0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
11800 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
11810 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
11820 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
11830 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
11840 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
11850 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
11860 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73  Cols | (((Bitmas
11870 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b  k)1)<<(BMS-1)));
11880 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
11890 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
118a0 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
118b0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
118c0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
118d0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
118e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
118f0 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
11900 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11910 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
11920 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
11930 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
11940 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e  1)<<i) ) nColumn
11950 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
11960 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
11970 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
11980 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f  S-1)) ){.    nCo
11990 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
119a0 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
119b0 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
119c0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
119d0 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
119e0 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
119f0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
11a00 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
11a10 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
11a20 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
11a30 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
11a40 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
11a50 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
11a60 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
11a70 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
11a80 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
11a90 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
11aa0 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
11ab0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
11ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ad0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
11ae0 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
11af0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11b00 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
11b10 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
11b20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
11b30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
11b40 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
11b50 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
11b60 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
11b70 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
11b80 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11b90 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
11ba0 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
11bb0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
11bc0 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
11bd0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
11be0 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
11bf0 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
11c00 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
11c10 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
11c20 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
11c30 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
11c40 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
11c50 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
11c60 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
11c70 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
11c80 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
11c90 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
11ca0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
11cb0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
11cc0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
11cd0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
11ce0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
11cf0 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
11d00 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
11d10 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  <<iCol;.      if
11d20 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
11d30 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
11d40 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
11d50 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
11d60 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
11d70 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
11d80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
11d90 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
11da0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
11db0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
11dc0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
11dd0 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
11de0 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
11df0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
11e00 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
11e10 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
11e20 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
11e30 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
11e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11e50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
11e60 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
11e70 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
11e80 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
11e90 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
11ea0 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
11eb0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
11ec0 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
11ed0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
11ee0 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
11ef0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
11f00 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69  xtraCols & (((Bi
11f10 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a  tmask)1)<<i) ){.
11f20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
11f30 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
11f40 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
11f50 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
11f60 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
11f70 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
11f80 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
11f90 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
11fa0 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
11fb0 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
11fc0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11fd0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
11fe0 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
11ff0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12000 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
12010 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
12020 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f    assert( n==nCo
12030 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72  lumn );..  /* Cr
12040 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
12050 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b  ic index */.  pK
12060 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyinfo = sqlite3
12070 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
12080 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73  rse, pIdx);.  as
12090 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
120a0 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71  dxCur>=0 );.  sq
120b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
120c0 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
120d0 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
120e0 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c  xCur, nColumn+1,
120f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12100 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
12110 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  Keyinfo, P4_KEYI
12120 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
12130 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12140 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65  "for %s", pTable
12150 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a  ->zName));..  /*
12160 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61   Fill the automa
12170 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63  tic index with c
12180 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  ontent */.  addr
12190 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
121a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
121b0 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  wind, pLevel->iT
121c0 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63  abCur);.  regRec
121d0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
121e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
121f0 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
12200 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
12210 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
12220 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
12230 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ord, 1);.  sqlit
12240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12250 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
12260 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
12270 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12280 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12290 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
122a0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
122b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
122c0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
122d0 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
122e0 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
122f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12300 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12310 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
12320 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12330 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
12340 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
12350 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12360 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
12370 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
12380 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
12390 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
123a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
123b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
123c0 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
123d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
123e0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
123f0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
12400 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12410 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
12420 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
12430 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
12440 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12450 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
12460 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
12470 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
12480 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
12490 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
124a0 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
124b0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
124c0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
124d0 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
124e0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
124f0 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
12500 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
12510 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
12520 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
12530 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
12540 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
12550 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
12560 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
12570 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
12580 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
12590 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
125a0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
125b0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
125c0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
125d0 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
125e0 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
125f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
12600 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
12610 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
12620 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
12630 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
12640 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12650 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
12660 57 48 45 52 45 54 52 41 43 45 28 28 22 52 65 63  WHERETRACE(("Rec
12670 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69  omputing index i
12680 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22  nfo for %s...\n"
12690 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
126a0 61 6d 65 29 29 3b 2a 2f 0a 0a 20 20 2f 2a 20 43  ame));*/..  /* C
126b0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
126c0 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
126d0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
126e0 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
126f0 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
12700 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ual table */.  f
12710 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
12720 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
12730 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
12740 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12750 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
12760 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
12770 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
12780 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
12790 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
127a0 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
127b0 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
127c0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
127d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
127e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
127f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12800 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
12810 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
12820 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
12830 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
12840 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
12850 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12860 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
12870 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
12880 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
12890 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
128a0 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
128b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
128c0 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
128d0 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
128e0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
128f0 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
12900 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
12910 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
12920 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
12930 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
12940 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
12950 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
12960 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
12970 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
12980 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
12990 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
129a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
129b0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
129c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
129d0 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
129e0 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
129f0 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
12a00 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
12a10 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
12a20 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
12a30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12a40 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
12a50 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12a60 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
12a70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12a80 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
12a90 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
12aa0 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
12ad0 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
12ae0 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
12b10 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
12b20 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
12b30 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
12b40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12b50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
12b60 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
12b70 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20     /* (double)0 
12b80 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
12b90 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
12ba0 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
12bb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12bc0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12bd0 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
12be0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
12bf0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
12c00 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
12c10 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
12c20 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
12c30 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
12c40 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
12c50 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
12c60 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
12c70 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
12c80 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
12c90 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
12ca0 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
12cb0 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
12cc0 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12cd0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12ce0 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
12cf0 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
12d00 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12d10 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
12d20 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
12d30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
12d40 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
12d50 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
12d60 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
12d70 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
12d80 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
12d90 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
12da0 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
12db0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
12dc0 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
12dd0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
12de0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12df0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
12e00 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
12e10 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
12e20 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12e30 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
12e40 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
12e50 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
12e60 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
12e70 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12e80 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
12e90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12ea0 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
12ef0 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
12f00 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
12f10 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
12f20 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
12f30 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  u8 op;.    if( p
12f40 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
12f50 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
12f60 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
12f70 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
12f80 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
12f90 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
12fa0 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
12fb0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
12fc0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
12fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12fe0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12ff0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
13000 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
13010 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
13020 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
13030 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
13040 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13050 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
13060 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  e;.    pIdxCons[
13070 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
13080 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
13090 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
130a0 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
130b0 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29  i;.    op = (u8)
130c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
130d0 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
130e0 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
130f0 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70  p = WO_EQ;.    p
13100 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
13110 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  op;.    /* The d
13120 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
13130 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
13140 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
13150 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
13160 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
13170 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
13180 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
13190 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
131a0 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
131b0 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
131c0 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
131d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
131e0 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
131f0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
13200 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13210 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
13220 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
13230 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
13240 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
13250 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
13260 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
13270 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
13280 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
13290 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
132a0 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
132b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
132c0 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
132d0 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
132e0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
132f0 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
13300 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
13310 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13320 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
13330 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
13340 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
13350 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
13360 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
13370 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
13380 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
13390 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
133a0 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
133b0 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
133c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
133d0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
133e0 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
133f0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
13400 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
13410 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
13420 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
13430 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
13440 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
13450 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
13460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
13470 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
13480 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
13490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
134a0 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
134b0 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
134c0 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
134d0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
134e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134f0 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  fo pointer passe
13500 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75  d.** as the argu
13510 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
13520 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
13530 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
13540 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
13550 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
13560 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
13570 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
13580 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
13590 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
135a0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
135b0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
135c0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
135d0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
135e0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
135f0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
13600 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
13610 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
13620 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
13630 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
13640 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
13650 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
13660 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
13670 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
13680 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
13690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
136a0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
136b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
136c0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
136d0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
136e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
136f0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
13700 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
13710 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
13720 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
13730 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 57 48   int rc;..  /*WH
13740 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73 74  ERETRACE(("xBest
13750 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c  Index for %s\n",
13760 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a   pTab->zName));*
13770 2f 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  /.  TRACE_IDX_IN
13780 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
13790 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
137a0 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
137b0 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
137c0 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
137d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
137e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
137f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
13800 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
13810 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13820 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
13830 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
13840 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
13850 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13860 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
13870 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
13880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13890 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
138a0 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
138b0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
138c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
138d0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
138e0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
138f0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
13900 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
13910 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
13920 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
13930 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
13940 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
13950 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
13960 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
13970 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13980 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
13990 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
139a0 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
139b0 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
139c0 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
139d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
139e0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
139f0 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
13a00 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
13a10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13a20 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
13a30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13a40 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
13a50 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
13a60 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
13a70 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
13a80 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
13a90 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
13aa0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
13ab0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
13ac0 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
13ad0 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
13ae0 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
13af0 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53  an pVal.**    aS
13b00 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
13b10 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13b20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a  equal to pVal.**
13b30 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
13b40 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
13b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13b60 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
13b70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13b90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13ba0 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
13bb0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
13bc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
13bd0 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
13be0 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  of */.  sqlite3_
13bf0 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20  value *pVal,    
13c00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
13c10 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
13c20 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
13c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
13c40 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
13c50 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
13c60 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
13c70 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
13c80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
13c90 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
13ca0 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20  */.){.  tRowcnt 
13cb0 6e 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  n;.  IndexSample
13cc0 20 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74   *aSample;.  int
13cd0 20 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74   i, eType;.  int
13ce0 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36 34   isEq = 0;.  i64
13cf0 20 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20   v;.  double r, 
13d00 72 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72  rS;..  assert( r
13d10 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75  oundUp==0 || rou
13d20 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73  ndUp==1 );.  ass
13d30 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
13d40 6c 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 56  le>0 );.  if( pV
13d50 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  al==0 ) return S
13d60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e  QLITE_ERROR;.  n
13d70 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
13d80 74 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20  t[0];.  aSample 
13d90 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
13da0 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
13db0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
13dc0 61 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  al);..  if( eTyp
13dd0 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
13de0 52 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c  R ){.    v = sql
13df0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
13e00 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20  (pVal);.    r = 
13e10 28 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72 28  (i64)v;.    for(
13e20 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
13e30 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
13e40 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
13e50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
13e60 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
13e70 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
13e80 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
13e90 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
13ea0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
13eb0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
13ec0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
13ed0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
13ee0 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a  le[i].u.i>=v ){.
13ef0 20 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d            isEq =
13f00 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d   aSample[i].u.i=
13f10 3d 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =v;.          br
13f20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
13f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13f40 20 20 20 20 61 73 73 65 72 74 28 20 61 53 61 6d      assert( aSam
13f50 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
13f60 4c 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20  LITE_FLOAT );.  
13f70 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
13f80 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20  e[i].u.r>=r ){. 
13f90 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20           isEq = 
13fa0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d  aSample[i].u.r==
13fb0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  r;.          bre
13fc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
13fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
13fe0 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
13ff0 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
14000 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76     r = sqlite3_v
14010 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
14020 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
14030 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  i<pIdx->nSample;
14040 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14050 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
14060 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
14070 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14080 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
14090 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
140a0 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  XT ) break;.    
140b0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
140c0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
140d0 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
140e0 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  rS = aSample[i].
140f0 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  u.r;.      }else
14100 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
14110 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20  Sample[i].u.i;. 
14120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14130 20 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20   rS>=r ){.      
14140 20 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a    isEq = rS==r;.
14150 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14170 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
14180 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
14190 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66     i = 0;.    if
141a0 28 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79  ( aSample[0].eTy
141b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
141c0 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65  ) isEq = 1;.  }e
141d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
141e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   eType==SQLITE_T
141f0 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  EXT || eType==SQ
14200 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  LITE_BLOB );.   
14210 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
14220 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
14230 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
14240 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
14250 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d  ITE_TEXT || aSam
14260 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
14270 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
14280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
142a0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
142b0 65 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20 20  e ){      .     
142c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
142d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
142e0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
142f0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
14300 2a 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  *z;.      if( eT
14310 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
14320 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
14330 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
14340 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
14350 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
14360 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14370 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
14380 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
14390 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
143a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
143b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
143c0 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
143d0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 54  Parse, SQLITE_UT
143e0 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a  F8, 0, *pIdx->az
143f0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
14400 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
14410 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14420 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14440 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
14450 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
14460 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
14470 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
14480 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  !z ){.          
14490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
144a0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
144b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
144c0 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f   && pColl && pCo
144d0 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20  ll->xCmp );.    
144e0 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71    }.      n = sq
144f0 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
14500 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
14510 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28  );.  .      for(
14520 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
14530 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
14540 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
14550 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
14560 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
14570 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
14580 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70  eSampletype<eTyp
14590 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
145a0 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
145b0 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62  etype!=eType ) b
145c0 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
145d0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
145e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
145f0 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
14600 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
14610 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
14620 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
14630 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
14640 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
14650 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
14660 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
14670 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
14680 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
14690 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
146a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
146b0 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
146c0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
146d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
146e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
146f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14710 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
14720 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
14730 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
14740 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
14750 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14760 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
14770 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
14780 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
14790 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20    {.          c 
147a0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
147b0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
147c0 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
147d0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
147e0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
147f0 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20         if( c>=0 
14800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
14810 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31   c==0 ) isEq = 1
14820 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14830 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14850 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14860 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
14870 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
14880 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
14890 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
148a0 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
148b0 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
148c0 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
148d0 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
148e0 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
148f0 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
14900 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45  ==pVal, then isE
14910 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  q==1..  */.  if(
14920 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73   isEq ){.    ass
14930 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
14940 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61  mple );.    aSta
14950 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
14960 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74  ].nLt;.    aStat
14970 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
14980 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .nEq;.  }else{. 
14990 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
149a0 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
149b0 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
149c0 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
149d0 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
149e0 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74  = aSample[0].nLt
149f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14a00 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70     iUpper = i>=p
14a10 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e  Idx->nSample ? n
14a20 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   : aSample[i].nL
14a30 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  t;.      iLower 
14a40 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  = aSample[i-1].n
14a50 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  Eq + aSample[i-1
14a60 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ].nLt;.    }.   
14a70 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
14a80 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28  ->avgEq;.    if(
14a90 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
14aa0 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
14ab0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
14ac0 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
14ad0 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
14ae0 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
14af0 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
14b00 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
14b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14b20 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
14b30 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
14b40 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
14b50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14b60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
14b70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14b80 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a  BLE_STAT3 */../*
14b90 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
14ba0 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
14bb0 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
14bc0 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
14bd0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
14be0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
14bf0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
14c00 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
14c10 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
14c20 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
14c30 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
14c40 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
14c50 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14c60 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
14c70 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14c80 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
14c90 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
14ca0 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
14cb0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
14cc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
14cd0 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
14ce0 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
14cf0 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
14d00 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
14d10 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
14d20 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
14d30 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
14d40 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
14d50 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
14d60 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
14d70 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
14d80 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
14d90 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
14da0 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
14db0 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
14dc0 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
14dd0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
14de0 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
14df0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
14e00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
14e10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
14e20 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
14e30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
14e40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14e50 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20  LE_STAT3.static 
14e60 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
14e70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
14e80 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
14e90 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
14ea0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14eb0 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45  **pp.){.  if( pE
14ec0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
14ed0 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70  ABLE.   || (pExp
14ee0 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
14ef0 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32  ER && pExpr->op2
14f00 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20  ==TK_VARIABLE). 
14f10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72   ){.    int iVar
14f20 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
14f30 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
14f40 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
14f50 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
14f60 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  );.    *pp = sql
14f70 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
14f80 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
14f90 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
14fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14fb0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
14fc0 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
14fd0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
14fe0 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
14ff0 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
15000 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15020 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
15030 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15040 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15050 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
15060 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
15070 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
15080 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
15090 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
150a0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
150b0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
150c0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
150d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
150e0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
150f0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
15100 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
15110 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
15120 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
15130 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
15140 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
15150 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
15160 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
15170 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
15180 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
15190 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
151c0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
151e0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
15210 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
15220 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
15230 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
15240 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
15250 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
15260 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
15270 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15280 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
15290 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
152a0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
152b0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
152c0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
152d0 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
152e0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
152f0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
15300 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
15310 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15320 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
15330 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
15340 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
15350 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
15360 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
15370 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
15380 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
15390 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
153a0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
153b0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
153c0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
153d0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
153e0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
153f0 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
15400 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
15410 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
15420 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
15430 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
15440 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
15450 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
15460 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
15470 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
15480 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
15490 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
154a0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
154b0 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
154c0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
154d0 20 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69   an integer divi
154e0 73 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68  sor to reduce th
154f0 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73  e estimated.** s
15500 65 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20  earch space.  A 
15510 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
15520 31 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e  1 means that ran
15530 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
15540 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74  re.** no help at
15550 20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20   all.  A return 
15560 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73  value of 2 means
15570 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
15580 74 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74  ts are.** expect
15590 65 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ed to reduce the
155a0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
155b0 20 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66   half.  And so f
155c0 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  orth....**.** In
155d0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
155e0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41  sqlite_stat3 ANA
155f0 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20  LYZE data, each 
15600 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
15610 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20  .** reduces the 
15620 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
15630 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20  a factor of 4.  
15640 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63  Hence a single c
15650 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a  onstraint (x>?).
15660 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  ** results in a 
15670 72 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20  return of 4 and 
15680 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  a range constrai
15690 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  nt (x>? AND x<?)
156a0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61   results.** in a
156b0 20 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a   return of 16..*
156c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
156d0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
156e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
156f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15700 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
15710 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15720 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
15730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
15740 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ex containing th
15750 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
15760 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a   column; "x" */.
15770 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
15780 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20         /* index 
15790 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f  into p->aCol[] o
157a0 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  f the range-comp
157b0 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ared column */. 
157c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
157d0 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
157e0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
157f0 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
15800 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
15810 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
15820 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
15830 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
15840 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
15850 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
15860 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67  .  double *pRang
15870 65 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52  eDiv   /* OUT: R
15880 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61  educe search spa
15890 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73  ce by this divis
158a0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
158b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
158c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
158d0 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66  ABLE_STAT3..  if
158e0 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e  ( nEq==0 && p->n
158f0 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
15900 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61  lite3_value *pRa
15910 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77  ngeVal;.    tRow
15920 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  cnt iLower = 0;.
15930 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
15940 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
15950 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  [0];.    tRowcnt
15960 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66   a[2];.    u8 af
15970 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
15980 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
15990 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
159a0 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
159b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
159c0 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
159d0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
159e0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
159f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
15a00 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
15a10 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
15a20 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  rt( (pLower->eOp
15a30 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
15a40 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
15a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15a60 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20  TE_OK.       && 
15a70 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
15a80 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56  arse, p, pRangeV
15a90 61 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54  al, 0, a)==SQLIT
15aa0 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
15ab0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
15ac0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
15ad0 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
15ae0 74 6f 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20  tor & WO_GT)!=0 
15af0 29 20 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d  ) iLower += a[1]
15b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15b10 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
15b20 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
15b30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
15b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70  QLITE_OK && pUpp
15b50 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
15b60 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
15b70 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
15b80 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
15b90 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
15ba0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
15bb0 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20  RangeVal);.     
15bc0 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72   assert( (pUpper
15bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
15be0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
15bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15c00 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
15c10 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61    && whereKeySta
15c20 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
15c30 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d  angeVal, 1, a)==
15c40 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
15c50 29 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ){.        iUppe
15c60 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
15c70 20 20 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65    if( (pUpper->e
15c80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
15c90 29 21 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d  )!=0 ) iUpper +=
15ca0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
15cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
15cc0 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
15cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15cf0 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
15d00 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  r<=iLower ){.   
15d10 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20       *pRangeDiv 
15d20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52  = (double)p->aiR
15d30 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  owEst[0];.      
15d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
15d50 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
15d60 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
15d70 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70  0]/(double)(iUpp
15d80 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
15d90 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 57 48      }.      /*WH
15da0 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65  ERETRACE(("range
15db0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
15dc0 75 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e 22  u..%u  div=%g\n"
15dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15de0 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c      (u32)iLower,
15df0 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70   (u32)iUpper, *p
15e00 52 61 6e 67 65 44 69 76 29 29 3b 2a 2f 0a 20 20  RangeDiv));*/.  
15e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15e20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
15e30 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
15e40 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
15e50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
15e60 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
15e70 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
15e80 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
15e90 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
15ea0 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65  per );.  *pRange
15eb0 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Div = (double)1;
15ec0 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
15ed0 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
15ee0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
15ef0 3d 30 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20  =0 ) *pRangeDiv 
15f00 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20  *= (double)4;.  
15f10 69 66 28 20 70 55 70 70 65 72 20 29 20 2a 70 52  if( pUpper ) *pR
15f20 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62  angeDiv *= (doub
15f30 6c 65 29 34 3b 0a 20 20 72 65 74 75 72 6e 20 72  le)4;.  return r
15f40 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
15f50 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
15f60 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
15f70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
15f80 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
15f90 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
15fa0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
15fb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
15fc0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
15fd0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
15fe0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
15ff0 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
16000 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
16010 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
16020 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
16030 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
16040 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
16050 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
16060 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
16070 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
16080 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
16090 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
160a0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
160b0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
160c0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
160d0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
160e0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
160f0 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
16100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16110 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
16120 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
16130 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
16140 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
16150 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
16160 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
16170 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
16180 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
16190 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
161a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
161b0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
161c0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
161d0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
161e0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
161f0 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
16200 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
16210 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
16220 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
16230 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
16240 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
16250 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16260 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
16270 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
16280 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
16290 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
162a0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
162b0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
162c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
162d0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
162e0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
162f0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
16300 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16310 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
16320 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
16330 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
16340 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  nt */.  double *
16350 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
16360 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
16370 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
16380 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
16390 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
163a0 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
163b0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
163c0 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
163d0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
163e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
163f0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
16400 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
16410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16420 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
16430 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
16440 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
16450 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
16460 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
16470 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
16480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16490 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
164a0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
164b0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
164c0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
164d0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
164e0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
164f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
16500 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
16510 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
16520 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
16530 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
16540 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
16550 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
16560 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
16570 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
16580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16590 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
165a0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
165b0 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
165c0 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
165d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
165e0 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28    /*WHERETRACE((
165f0 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
16600 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
16610 69 6e 74 29 61 5b 31 5d 29 29 3b 2a 2f 0a 20 20  int)a[1]));*/.  
16620 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
16630 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53  .  }.whereEqualS
16640 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
16650 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16660 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
16670 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16680 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
16690 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
166a0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
166b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
166c0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
166d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
166e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
166f0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
16700 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
16710 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
16720 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
16730 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
16740 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
16750 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
16760 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
16770 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
16780 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
16790 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
167a0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
167b0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
167c0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
167d0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
167e0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
167f0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
16800 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
16810 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
16820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
16830 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
16840 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
16850 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
16860 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
16870 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
16880 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
16890 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
168a0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
168b0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
168c0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
168d0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
168e0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
168f0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
16900 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
16910 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
16920 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
16930 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
16940 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
16950 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
16960 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
16970 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16980 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
16990 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
169a0 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
169b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
169c0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
169d0 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
169e0 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
169f0 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
16a00 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20  double *pnRow   
16a10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
16a20 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
16a30 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
16a40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16a50 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16a60 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
16a70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16a80 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20  double nEst;    
16a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16aa0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
16ab0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
16ac0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
16ad0 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b  Est = (double)0;
16ae0 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
16af0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
16b00 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
16b10 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
16b20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16b30 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
16b40 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
16b50 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
16b60 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
16b70 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
16b80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
16b90 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
16ba0 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  0];.    rc = whe
16bb0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
16bc0 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d  Parse, p, pList-
16bd0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
16be0 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
16bf0 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20   += nEst;.  }.  
16c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16c10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
16c20 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45  wEst > p->aiRowE
16c30 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20  st[0] ) nRowEst 
16c40 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
16c50 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
16c60 52 6f 77 45 73 74 3b 0a 20 20 20 20 2f 2a 57 48  RowEst;.    /*WH
16c70 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
16c80 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
16c90 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
16ca0 3b 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ;*/.  }.  return
16cb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
16cc0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16cd0 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f  ENABLE_STAT3) */
16ce0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
16cf0 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
16d00 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
16d10 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
16d20 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
16d30 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
16d40 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16d50 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
16d60 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
16d70 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
16d80 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
16d90 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
16da0 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
16db0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
16dc0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
16dd0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
16de0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
16df0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
16e00 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
16e10 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
16e20 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
16e30 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
16e40 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
16e50 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
16e60 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
16e70 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
16e80 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
16e90 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
16ea0 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
16eb0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
16ec0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
16ed0 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
16ee0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
16ef0 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
16f00 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
16f10 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
16f20 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
16f30 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
16f40 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
16f50 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
16f60 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
16f70 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35  TATION-OF: R-245
16f80 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74  97-58655 No test
16f90 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74  s are done for t
16fa0 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a  erms that are.**
16fb0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69   completely sati
16fc0 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73  sfied by indices
16fd0 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
16fe0 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
16ff0 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
17000 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
17010 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
17020 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
17030 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
17040 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
17050 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
17060 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
17070 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
17080 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
17090 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
170a0 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
170b0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
170c0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
170d0 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
170e0 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
170f0 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
17100 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
17110 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
17120 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
17130 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
17140 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
17150 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
17160 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
17170 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
17180 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
17190 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
171a0 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
171b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
171c0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
171d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
171e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
171f0 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
17200 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
17210 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
17220 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
17230 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
17240 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
17250 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
17260 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
17270 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
17280 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
17290 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
172a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
172b0 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
172c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
172d0 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
172e0 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
172f0 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
17300 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
17310 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17320 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
17330 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
17340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
17350 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
17360 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
17370 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
17380 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
17390 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
173a0 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
173b0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
173c0 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
173d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
173e0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
173f0 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
17400 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
17410 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
17420 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
17430 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
17440 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
17450 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
17460 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
17470 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
17480 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
17490 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
174a0 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
174b0 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
174c0 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
174d0 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
174e0 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
174f0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
17500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
17510 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
17520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
17530 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
17540 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
17550 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17560 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
17570 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
17580 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
17590 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
175a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
175b0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
175c0 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
175d0 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
175e0 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
175f0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
17600 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
17610 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
17620 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
17630 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
17640 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
17650 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
17660 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
17670 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
17680 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
17690 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
176a0 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
176b0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
176c0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
176d0 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
176e0 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
176f0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
17700 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
17710 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
17720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17730 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
17740 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
17750 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17760 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
17770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
17780 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
17790 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
177a0 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
177b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
177c0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
177d0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
177e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
177f0 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
17800 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
17810 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
17820 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
17830 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
17840 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
17850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
17860 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
17870 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
17880 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
17890 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
178a0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
178b0 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
178c0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
178d0 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
178e0 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
178f0 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
17900 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
17910 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
17920 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
17930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
17940 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
17950 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
17960 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
17970 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
17980 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
17990 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
179a0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
179b0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
179c0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
179d0 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
179e0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
179f0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
17a00 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
17a10 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
17a20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
17a30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17a40 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
17a50 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
17a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17a70 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
17a80 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
17a90 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
17aa0 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
17ab0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
17ac0 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e  reverse-order IN
17ad0 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
17ae0 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
17af0 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
17b00 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
17b10 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
17b20 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
17b30 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
17b40 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
17b50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17b60 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
17b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17b80 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
17b90 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
17ba0 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
17bb0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
17bc0 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
17bd0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
17be0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
17bf0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
17c00 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
17c10 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
17c20 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
17c30 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
17c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17c50 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
17c60 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
17c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
17c80 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
17c90 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
17ca0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
17cb0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
17cc0 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f  In;.    WhereLoo
17cd0 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  p *pLoop = pLeve
17ce0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
17cf0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
17d00 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
17d10 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20  UALTABLE)==0.   
17d20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
17d30 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20  tree.pIndex!=0. 
17d40 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
17d50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61  .btree.pIndex->a
17d60 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20  SortOrder[iEq]. 
17d70 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
17d80 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a  case( iEq==0 );.
17d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17da0 69 45 71 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61  iEq==pLevel->pla
17db0 6e 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n.u.pIdx->nColum
17dc0 6e 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  n-1 );.      tes
17dd0 74 63 61 73 65 28 20 69 45 71 3e 30 20 26 26 20  tcase( iEq>0 && 
17de0 69 45 71 2b 31 3c 70 4c 65 76 65 6c 2d 3e 70 6c  iEq+1<pLevel->pl
17df0 61 6e 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75  an.u.pIdx->nColu
17e00 6d 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mn );.      test
17e10 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
17e20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
17e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
17e40 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
17e50 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
17e60 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
17e70 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
17e80 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
17e90 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pX, 0);.    if( 
17ea0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17eb0 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
17ec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
17ed0 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
17ee0 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
17ef0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
17f00 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
17f10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17f20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
17f30 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
17f40 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
17f50 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
17f60 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
17f70 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  OR)==0 );.    pL
17f80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
17f90 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
17fa0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
17fb0 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
17fc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
17fd0 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
17fe0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17ff0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
18000 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
18010 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
18020 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
18030 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
18040 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
18050 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
18060 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
18090 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
180a0 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
180b0 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
180c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
180d0 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
180e0 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
180f0 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
18100 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
18110 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
18120 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
18130 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
18140 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
18150 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
18160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18170 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
18180 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
18190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
181a0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
181b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181c0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
181d0 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
181f0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
18200 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
18210 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
18220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18230 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
18240 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
18250 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
18260 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
18270 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
18280 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
18290 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
182a0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
182b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
182c0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
182d0 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
182e0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
182f0 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
18300 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
18310 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
18320 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
18330 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
18340 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
18350 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
18360 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
18370 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
18380 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
18390 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
183a0 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
183b0 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
183c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
183d0 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
183e0 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
183f0 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
18400 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
18410 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
18420 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
18430 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
18440 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
18450 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
18460 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
18470 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
18480 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
18490 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
184a0 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
184b0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
184c0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
184d0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
184e0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
184f0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
18500 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
18510 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
18520 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
18530 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
18540 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
18550 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
18560 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
18570 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
18580 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
18590 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
185a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
185b0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
185c0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
185d0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
185e0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
185f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18600 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
18610 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
18620 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
18630 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
18640 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
18650 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
18660 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
18670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
18680 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
18690 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
186a0 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
186b0 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
186c0 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
186d0 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
186e0 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
186f0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
18700 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
18710 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
18720 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
18730 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
18740 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
18750 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
18760 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
18770 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
18780 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
18790 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
187a0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
187b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
187c0 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
187d0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
187e0 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
187f0 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
18800 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
18810 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
18820 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
18830 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
18840 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
18850 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
18860 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
18870 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
18880 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
18890 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
188a0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
188b0 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
188c0 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
188d0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
188e0 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
188f0 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
18900 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
18910 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
18920 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
18930 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
18940 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
18950 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
18960 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
18970 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
18980 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
18990 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
189a0 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
189b0 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
189c0 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
189d0 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
189e0 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
189f0 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
18a00 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
18a10 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
18a20 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
18a30 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
18a40 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
18a50 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
18a60 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
18a70 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
18a80 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
18a90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18aa0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18ab0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
18ac0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
18ad0 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
18ae0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
18af0 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
18b00 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
18b10 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
18b20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
18b30 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
18b40 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
18b50 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
18b60 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
18b70 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
18b80 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
18b90 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65        /* Reverse
18ba0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
18bb0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
18bc0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20  int nExtraReg,  
18bd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18be0 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
18bf0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
18c00 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66  /.  char **pzAff
18c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
18c20 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  : Set to point t
18c30 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
18c40 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  g */.){.  int nE
18c50 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
18c60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
18c70 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
18c80 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
18c90 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
18ca0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18cb0 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
18cc0 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
18cd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
18ce0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
18cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18d00 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
18d10 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
18d20 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
18d30 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
18d40 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
18d50 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
18d60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
18d70 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
18d80 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
18d90 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
18da0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
18db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18dc0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18dd0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18df0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
18e00 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18e30 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
18e40 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
18e50 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  *zAff;          
18e60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
18e70 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72  nity string to r
18e80 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  eturn */..  /* T
18e90 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
18ea0 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
18eb0 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
18ec0 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
18ed0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
18ee0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72  >pWLoop;.  asser
18ef0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
18f00 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
18f10 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
18f20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
18f30 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70 49 64  btree.nEq;.  pId
18f40 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
18f50 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73  ee.pIndex;.  ass
18f60 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
18f70 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
18f80 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
18f90 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
18fa0 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
18fb0 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72  e them..  */.  r
18fc0 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
18fd0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65  >nMem + 1;.  nRe
18fe0 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  g = pLoop->u.btr
18ff0 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  ee.nEq + nExtraR
19000 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
19010 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
19020 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
19030 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
19040 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
19050 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
19060 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
19070 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
19080 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19090 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
190a0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
190b0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
190c0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
190d0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
190e0 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
190f0 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
19100 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
19110 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54  Term = pLoop->aT
19120 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
19130 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
19140 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
19150 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
19160 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
19170 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
19180 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
19190 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
191a0 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
191b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
191c0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
191d0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
191e0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
191f0 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
19200 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
19210 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
19220 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
19230 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
19240 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
19250 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
19260 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
19270 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
19280 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
19290 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
192a0 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
192b0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
192c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
192d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
192e0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
192f0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
19300 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19330 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
19340 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
19350 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
19360 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
19370 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
19380 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19390 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
193a0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
193b0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
193c0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
193d0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
193e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
193f0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
19400 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
19410 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19420 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
19430 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
19440 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
19450 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
19460 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
19470 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
19480 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
19490 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
194a0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
194b0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
194c0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
194d0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
194e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
194f0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
19500 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
19510 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
19520 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
19530 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
19540 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
19550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19560 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
19570 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
19580 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
19590 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
195a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
195b0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
195c0 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
195d0 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
195e0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
195f0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
19600 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
19610 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
19620 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
19630 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
19640 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
19650 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
19660 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
19670 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
19680 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
19690 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
196a0 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
196b0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
196c0 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
196d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
196e0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
196f0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
19700 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
19710 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
19720 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
19730 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
19740 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
19750 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19760 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
19770 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
19780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
19790 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
197a0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
197b0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
197c0 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
197d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
197e0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
197f0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
19800 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
19810 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
19820 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
19830 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
19840 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
19850 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
19860 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
19870 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
19880 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
19890 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
198a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
198b0 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
198c0 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
198d0 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
198e0 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
198f0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
19900 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
19910 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
19920 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
19930 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
19940 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
19950 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
19960 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
19970 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
19980 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
19990 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
199a0 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
199b0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
199c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
199d0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
199e0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
199f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
19a00 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
19a10 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
19a20 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
19a30 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
19a40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19a50 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
19a60 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
19a70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
19a80 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
19a90 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
19aa0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
19ab0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
19ac0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
19ad0 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
19ae0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
19af0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
19b00 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
19b10 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
19b20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
19b30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
19b40 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
19b50 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
19b60 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
19b70 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
19b80 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
19b90 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
19ba0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
19bb0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
19bc0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e  .btree.nEq;.  in
19bd0 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
19be0 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
19bf0 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f  Col;.  int *aiCo
19c00 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
19c10 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
19c20 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
19c30 70 49 6e 64 65 78 3d 3d 30 20 29 20 72 65 74 75  pIndex==0 ) retu
19c40 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 45 71 3d  rn 0;.  if( nEq=
19c50 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73  =0 && (pLoop->ws
19c60 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
19c70 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
19c80 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b  OP_LIMIT))==0 ){
19c90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19ca0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
19cb0 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30  ccumInit(&txt, 0
19cc0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  , 0, SQLITE_MAX_
19cd0 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64  LENGTH);.  txt.d
19ce0 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65  b = db;.  sqlite
19cf0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
19d00 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a  &txt, " (", 2);.
19d10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
19d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c  ; i++){.    expl
19d30 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
19d40 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f  xt, i, aCol[aiCo
19d50 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20  lumn[i]].zName, 
19d60 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d  "=");.  }..  j =
19d70 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
19d80 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
19d90 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
19da0 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
19db0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
19dc0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
19dd0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
19de0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
19df0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
19e00 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20   i++, z, ">");. 
19e10 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
19e20 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  wsFlags&WHERE_TO
19e30 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  P_LIMIT ){.    c
19e40 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
19e50 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f  dex->nColumn ) ?
19e60 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
19e70 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
19e80 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
19e90 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
19ea0 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
19eb0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
19ec0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
19ed0 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 1);.  return 
19ee0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
19ef0 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a  inish(&txt);.}..
19f00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19f10 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
19f20 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20  nless currently 
19f30 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58  processing an EX
19f40 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
19f50 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20  .** command. If 
19f60 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  the query being 
19f70 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45  compiled is an E
19f80 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
19f90 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  N, a single.** r
19fa0 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
19fb0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
19fc0 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
19fd0 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
19fe0 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a   in .** pLevel..
19ff0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1a000 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1a010 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1a040 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1a050 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1a060 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1a070 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1a080 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
1a090 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1a0a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1a0b0 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
1a0c0 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1a0d0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
1a0e0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1a0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1a100 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1a110 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1a120 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1a150 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1a160 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1a170 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a190 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1a1a0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1a1b0 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66  gin() */.){.  if
1a1c0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1a1d0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72 75  n==2 ){.    stru
1a1e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a1f0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1a200 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1a210 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
1a220 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a230 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
1a240 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
1a250 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
1a260 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a270 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1a280 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63   handle */.    c
1a290 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a2b0 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1a2c0 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1a2d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1a2e0 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Row;           /
1a2f0 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
1a300 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
1a310 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20  d by scan */.   
1a320 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73   int iId = pPars
1a330 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f  e->iSelectId;  /
1a340 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66  * Select id (lef
1a350 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f  t-most output co
1a360 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn) */.    int
1a370 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
1a380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a390 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
1a3a0 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
1a3b0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
1a3c0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1a3d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1a3e0 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f  trolling WhereLo
1a3f0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  op object */.   
1a400 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20   u32 flags;     
1a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a420 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73  * Flags that des
1a430 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20  cribe this loop 
1a440 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1a450 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a460 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1a470 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1a480 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1a490 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1a4a0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1a4b0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1a4c0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
1a4d0 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26  Search = (flags&
1a4e0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
1a4f0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
1a500 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
1a510 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45    || ((flags&WHE
1a520 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1a530 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75  ==0 && (pLoop->u
1a540 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20  .btree.nEq>0)). 
1a550 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
1a560 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
1a570 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
1a580 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
1a590 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
1a5a0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a5b0 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
1a5c0 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
1a5d0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1a5e0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1a5f0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1a600 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1a610 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
1a620 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
1a630 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1a640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
1a650 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1a660 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1a670 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
1a680 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
1a690 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1a6a0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1a6b0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1a6c0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1a6d0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
1a6e0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
1a6f0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1a700 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1a710 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
1a720 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a730 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4c  ))==0.     && pL
1a740 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a750 64 65 78 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  dex!=0.    ){.  
1a760 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
1a770 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52   = explainIndexR
1a780 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20  ange(db, pLoop, 
1a790 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1a7a0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1a7b0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1a7c0 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25  Msg, "%s USING %
1a7d0 73 25 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c  s%sINDEX%s%s%s",
1a7e0 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20   zMsg, .        
1a7f0 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1a800 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41  E_TEMP_INDEX)?"A
1a810 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a  UTOMATIC ":""),.
1a820 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
1a830 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1a840 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a  LY)?"COVERING ":
1a850 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
1a860 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
1a870 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20  EMP_INDEX)?"":" 
1a880 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
1a890 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
1a8a0 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c  MP_INDEX)?"": pL
1a8b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a8c0 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  dex->zName),.   
1a8d0 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20         zWhere.  
1a8e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
1a8f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1a900 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
1a910 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
1a920 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
1a930 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
1a940 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
1a950 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1a960 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1a970 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49  Msg, "%s USING I
1a980 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1a990 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20  EY", zMsg);..   
1a9a0 20 20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45     if( flags&WHE
1a9b0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a  RE_COLUMN_EQ ){.
1a9c0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1a9d0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1a9e0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1a9f0 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
1aa00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1aa10 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
1aa20 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
1aa30 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
1aa40 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1aa50 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1aa60 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1aa70 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
1aa80 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1aa90 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1aaa0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1aab0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1aac0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1aad0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1aae0 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
1aaf0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1ab00 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  f( flags&WHERE_T
1ab10 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1ab20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1ab30 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1ab40 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
1ab50 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1ab60 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1ab70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1ab80 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
1ab90 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1aba0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1abb0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
1abc0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1abd0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1abe0 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
1abf0 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
1ac00 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
1ac10 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1ac20 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
1ac30 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1ac40 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  xStr);.    }.#en
1ac50 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74 72  dif.    if( wctr
1ac60 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
1ac70 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
1ac80 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a  ORDERBY_MAX) ){.
1ac90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aca0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1acb0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29  RE_ORDERBY_MIN )
1acc0 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 31  ;.      nRow = 1
1acd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ace0 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74     nRow = (sqlit
1acf0 65 33 5f 69 6e 74 36 34 29 70 4c 6f 6f 70 2d 3e  e3_int64)pLoop->
1ad00 6e 4f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nOut;.    }.    
1ad10 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1ad20 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1ad30 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73   "%s (~%lld rows
1ad40 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b  )", zMsg, nRow);
1ad50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ad60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
1ad70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
1ad80 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l, iFrom, zMsg, 
1ad90 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1ada0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1adb0 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
1adc0 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
1add0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ade0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
1adf0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ae00 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
1ae10 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
1ae20 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
1ae30 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
1ae40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
1ae50 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
1ae60 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
1ae70 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
1ae80 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
1ae90 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
1aea0 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
1aeb0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1aec0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1aed0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
1aee0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
1aef0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
1af00 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
1af10 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77  coded */.  u16 w
1af20 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
1af30 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
1af40 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
1af50 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
1af60 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  .h */.  Bitmask 
1af70 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1af80 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1af90 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1afa0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1afb0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1afc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1afd0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1afe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1aff0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b000 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1b010 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1b020 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1b030 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1b040 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1b050 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1b060 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1b070 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b080 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1b090 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1b0a0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1b0b0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1b0c0 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1b0d0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1b0e0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1b0f0 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1b100 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1b110 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1b120 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1b130 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1b140 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1b150 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1b160 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1b170 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1b180 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1b190 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1b1a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1c0 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1b1d0 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1b1e0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1b200 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1b210 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
1b240 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
1b250 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
1b260 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1b270 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
1b280 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
1b290 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
1b2a0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
1b2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b2c0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1b2d0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
1b2e0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
1b2f0 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1b320 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
1b330 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
1b340 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
1b350 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1b360 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1b370 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
1b380 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
1b390 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
1b3a0 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
1b3b0 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
1b3c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1b3d0 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1b3e0 65 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  ewNotReady;     
1b3f0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1b400 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1b410 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1b420 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1b430 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49  dbe;.  pWC = pWI
1b440 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76  nfo->pWC;.  pLev
1b450 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1b460 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1b470 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1b480 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1b490 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1b4a0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1b4b0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1b4c0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1b4d0 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66  .  bRev = (pWInf
1b4e0 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76  o->revMask>>iLev
1b4f0 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62  el)&1;.  omitTab
1b500 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  le = (pLoop->wsF
1b510 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1b520 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
1b530 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
1b540 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
1b550 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
1b560 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b570 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20  (v, "Begin Join 
1b580 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65 6c  Loop %d", iLevel
1b590 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1b5a0 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1b5b0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1b5c0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1b5d0 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1b5e0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1b5f0 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1b600 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1b610 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1b620 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1b630 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1b640 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1b650 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1b660 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1b670 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1b680 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1b690 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1b6a0 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1b6b0 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1b6c0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1b6d0 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1b6e0 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1b6f0 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1b700 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1b710 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1b720 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1b730 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1b740 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1b750 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1b760 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1b770 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1b780 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1b790 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b7a0 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1b7b0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1b7c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1b7d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1b7e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1b7f0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1b800 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1b810 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1b820 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1b830 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1b840 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1b850 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1b860 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1b870 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1b880 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1b890 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1b8a0 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1b8b0 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1b8c0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1b8d0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1b8e0 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1b8f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1b900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b910 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1b920 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1b930 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1b940 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1b950 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1b960 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1b970 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1b980 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1b990 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1b9a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1b9b0 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1b9c0 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1b9d0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1b9e0 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1b9f0 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1ba00 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1ba10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ba20 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49  P_Integer, pTabI
1ba30 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1ba40 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  -1, regYield);. 
1ba50 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1ba60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba70 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
1ba80 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
1ba90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1baa0 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72  next row of co-r
1bab0 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62  outine %s", pTab
1bac0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
1bad0 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
1bae0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1baf0 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c  _If, regYield+1,
1bb00 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
1bb10 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
1bb20 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
1bb30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bb40 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1bb50 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73   if(  (pLoop->ws
1bb60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1bb70 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1bb80 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
1bb90 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
1bba0 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
1bbb0 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
1bbc0 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
1bbd0 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
1bbe0 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
1bbf0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
1bc00 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
1bc10 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
1bc20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1bc30 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e  NotFound;.    in
1bc40 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1bc50 70 4c 6f 6f 70 2d 3e 6e 54 65 72 6d 3b 0a 0a 20  pLoop->nTerm;.. 
1bc60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1bc70 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1bc80 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
1bc90 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1bca0 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
1bcb0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72  int+2);.    addr
1bcc0 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
1bcd0 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20  l->addrBrk;.    
1bce0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1bcf0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1bd00 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
1bd10 3d 20 69 52 65 67 2b 6a 2b 31 3b 0a 20 20 20 20  = iReg+j+1;.    
1bd20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1bd30 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  >aTerm[j];.     
1bd40 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1bd50 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
1bd60 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75  .        codeEqu
1bd70 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1bd80 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1bd90 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65   j, bRev, iTarge
1bda0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  t);.        addr
1bdb0 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
1bdc0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1bdd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bde0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bdf0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
1be00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1be10 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  Target);.      }
1be20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1be30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1be40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f  OP_Integer, pLoo
1be50 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1be60 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
1be70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1be80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
1be90 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
1bea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1beb0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1bec0 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1bed0 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1bf00 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1bf20 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1bf30 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1bf40 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1bf50 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1bf60 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1bf70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1bf80 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1bf90 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1bfa0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1bfb0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1bfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1bfd0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1bfe0 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 5d 29  pLoop->aTerm[j])
1bff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c000 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1c010 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1c020 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1c030 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1c040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1c050 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1c060 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c070 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1c080 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1c090 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1c0a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1c0b0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
1c0c0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1c0d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1c0e0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1c0f0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1c100 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1c110 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
1c120 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c130 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1c140 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
1c150 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1c160 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
1c170 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
1c180 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
1c190 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
1c1a0 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
1c1b0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1c1c0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1c1d0 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
1c1e0 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
1c1f0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1c200 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
1c210 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
1c220 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
1c230 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
1c240 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1c250 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
1c260 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
1c270 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1c280 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1c290 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1c2a0 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  aTerm[0];.    as
1c2b0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1c2c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1c2d0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
1c2e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
1c2f0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
1c300 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1c310 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1c320 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
1c330 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
1c340 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65   */.    iRowidRe
1c350 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1c360 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1c370 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1c380 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1c390 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
1c3a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1c3b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c3c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
1c3d0 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
1c3e0 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
1c3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c400 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1c410 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1c420 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1c430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c440 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1c450 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69  ge(pParse, iRowi
1c460 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71  dReg, 1);.    sq
1c470 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1c480 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1c490 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1c4a0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1c4b0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1c4c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1c4d0 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
1c4e0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1c4f0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1c500 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
1c510 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c520 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
1c530 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  ANGE)!=0.  ){.  
1c540 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65    /* Case 3:  We
1c550 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
1c560 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1c570 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1c580 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
1c590 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
1c5a0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
1c5b0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
1c5c0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
1c5d0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c5e0 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
1c5f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1c600 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1c610 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  j = 0;.    pStar
1c620 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20  t = pEnd = 0;.  
1c630 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1c640 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1c650 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20  _LIMIT ) pStart 
1c660 3d 20 70 4c 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a  = pLoop->aTerm[j
1c670 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1c680 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1c690 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1c6a0 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 54  pEnd = pLoop->aT
1c6b0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1c6c0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1c6d0 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1c6e0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1c6f0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1c700 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1c710 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1c720 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c740 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1c750 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1c760 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1c770 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1c780 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1c790 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1c7a0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1c7b0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1c7c0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c7d0 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1c7e0 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1c7f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1c800 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1c810 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1c820 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1c830 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1c840 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1c850 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1c860 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1c870 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1c880 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
1c890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1c8a0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1c8c0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1c8d0 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
1c8e0 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1c8f0 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
1c900 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1c910 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1c920 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1c930 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1c940 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1c950 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1c960 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1c970 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1c980 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1c990 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1c9a0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1c9b0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1c9c0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ct. */..      te
1c9d0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1c9e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1c9f0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
1ca00 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
1ca10 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  /.      pX = pSt
1ca20 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1ca30 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1ca40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ca50 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1ca60 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
1ca70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ca80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ca90 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1caa0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1cab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cac0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1cad0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1cae0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1caf0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1cb00 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1cb10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1cb20 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1cb30 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1cb40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1cb50 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1cb60 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1cb70 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1cb80 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1cb90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cbb0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1cbc0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1cbd0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1cbe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1cbf0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
1cc00 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
1cc10 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
1cc20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cc30 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1cc40 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
1cc50 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1cc60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cc70 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1cc80 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1cc90 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1cca0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65  1662 */.      me
1ccb0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1ccc0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ccd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cce0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1ccf0 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1cd00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1cd10 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1cd20 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1cd30 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1cd40 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1cd50 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1cd60 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1cd70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1cd80 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1cd90 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1cda0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1cdb0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1cdc0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1cdd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1cde0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1cdf0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1ce00 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1ce10 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1ce20 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1ce30 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69  2 = start;.    i
1ce40 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20  f( pStart==0 && 
1ce50 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pEnd==0 ){.     
1ce60 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
1ce70 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
1ce80 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
1ce90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cea0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1ceb0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
1cec0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1ced0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1cee0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1cef0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1cf00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1cf10 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1cf20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cf30 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1cf40 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1cf50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cf60 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1cf70 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1cf80 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1cf90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1cfa0 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1cfb0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1cfc0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1cfd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cfe0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1cff0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1d000 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1d010 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1d020 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1d030 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1d040 4e 5f 52 41 4e 47 45 20 7c 20 57 48 45 52 45 5f  N_RANGE | WHERE_
1d050 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 7c 0a 20 20  COLUMN_NULL |.  
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1d080 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
1d090 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
1d0a0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1d0b0 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1d0c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1d0d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1d0e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1d0f0 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1d100 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1d110 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d120 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1d130 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1d140 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1d150 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1d160 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1d170 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1d180 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1d190 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1d1a0 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1d1b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1d1c0 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1d1d0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1d1e0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1d1f0 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1d200 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1d210 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1d220 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1d230 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1d240 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1d250 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1d260 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1d270 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1d280 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1d290 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1d2a0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1d2b0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1d2c0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1d2d0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1d2e0 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1d2f0 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1d300 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1d310 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1d320 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1d330 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d340 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1d350 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d360 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1d370 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1d380 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1d390 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1d3a0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1d3b0 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1d3c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d3d0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1d3e0 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1d3f0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1d400 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1d410 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1d420 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1d430 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1d440 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1d450 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d460 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1d470 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1d480 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1d490 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1d4a0 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1d4b0 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1d4c0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1d4d0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1d4e0 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1d4f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d500 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1d510 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1d520 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1d530 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1d540 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1d550 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1d560 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1d570 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1d580 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1d590 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1d5a0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1d5b0 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1d5c0 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1d5d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1d5e0 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1d5f0 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1d600 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1d610 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1d620 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1d630 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1d640 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1d650 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1d660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d670 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1d680 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1d690 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1d6a0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
1d6b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1d6c0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1d6d0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1d6e0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1d6f0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1d710 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1d720 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1d730 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1d740 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
1d750 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1d760 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1d770 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1d780 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1d790 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
1d7a0 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1d7b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1d7c0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1d7d0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1d7e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1d7f0 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
1d800 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
1d810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1d820 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
1d830 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
1d840 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1d850 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1d860 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1d870 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1d880 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
1d890 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1d8a0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
1d8b0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1d8c0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
1d8d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f  >u.btree.nEq;  /
1d8e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1d8f0 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
1d900 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
1d910 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d920 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1d930 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
1d940 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
1d950 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1d980 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
1d990 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
1d9a0 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9c0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1d9d0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1d9e0 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1d9f0 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1da00 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1da10 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1da20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1da30 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1da40 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1da50 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1da60 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1da70 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1da80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1da90 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1daa0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1dab0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1dac0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1dad0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1dae0 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1daf0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1db00 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1db10 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1db20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1db30 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1db40 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1db50 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1db60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1db70 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1db80 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1db90 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1dba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dbb0 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1dbc0 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1dbd0 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1dbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dbf0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1dc00 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1dc10 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1dc20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dc30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1dc40 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1dc50 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1dc60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1dc70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1dc80 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1dc90 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1dca0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1dcb0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1dcc0 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1dcd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1dce0 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
1dcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd00 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1dd10 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1dd20 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
1dd30 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
1dd40 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
1dd50 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
1dd60 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
1dd70 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d   k = (nEq==pIdx-
1dd80 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20  >nColumn ? -1 : 
1dd90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1dda0 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Eq]);..    /* If
1ddb0 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
1ddc0 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
1ddd0 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
1dde0 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
1ddf0 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
1de00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
1de10 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
1de20 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
1de30 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
1de40 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1de50 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
1de60 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
1de70 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
1de80 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
1de90 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1dea0 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
1deb0 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
1dec0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
1ded0 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
1dee0 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
1def0 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
1df00 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
1df10 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
1df20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1df30 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
1df40 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
1df50 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
1df60 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
1df70 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
1df80 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
1df90 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
1dfa0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 6e 4f    && (pWInfo->nO
1dfb0 42 53 61 74 3e 30 29 0a 20 20 20 20 20 26 26 20  BSat>0).     && 
1dfc0 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
1dfd0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1dfe0 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
1dff0 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
1e000 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
1e010 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
1e020 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
1e030 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
1e040 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
1e050 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
1e060 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1e070 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1e080 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1e090 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1e0a0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1e0b0 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1e0c0 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1e0d0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1e0e0 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1e0f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1e100 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1e110 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1e120 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1e130 6f 6f 70 2d 3e 61 54 65 72 6d 5b 6a 2b 2b 5d 3b  oop->aTerm[j++];
1e140 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1e150 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1e160 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e170 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1e180 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1e190 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1e1a0 3e 61 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  >aTerm[j++];.   
1e1b0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1e1c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e1d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1e1e0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
1e1f0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
1e200 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
1e210 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
1e220 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
1e230 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
1e240 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
1e250 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1e260 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
1e270 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
1e280 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
1e290 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20  tyTerms(.       
1e2a0 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c   pParse, pLevel,
1e2b0 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20   pWC, notReady, 
1e2c0 62 52 65 76 2c 20 6e 45 78 74 72 61 52 65 67 2c  bRev, nExtraReg,
1e2d0 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20   &zStartAff.    
1e2e0 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d  );.    zEndAff =
1e2f0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1e300 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
1e310 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64  artAff);.    add
1e320 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1e330 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  ddrNxt;..    /* 
1e340 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1e350 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
1e360 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
1e370 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
1e380 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
1e390 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
1e3a0 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
1e3b0 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
1e3c0 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  e .    ** start 
1e3d0 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70  and end terms (p
1e3e0 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70  RangeStart and p
1e3f0 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a  RangeEnd)..    *
1e400 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70  /.    if( (nEq<p
1e410 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
1e420 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
1e430 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
1e440 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20  LITE_SO_ASC)).  
1e450 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70     || (bRev && p
1e460 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45  Idx->nColumn==nE
1e470 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1e480 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a  SWAP(WhereTerm *
1e490 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61  , pRangeEnd, pRa
1e4a0 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  ngeStart);.    }
1e4b0 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
1e4c0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
1e4d0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1e4e0 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
1e4f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1e500 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52  RangeStart && pR
1e510 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
1e520 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
1e530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1e540 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
1e550 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1e560 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74  & WO_LE );.    t
1e570 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e580 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d  nd && pRangeEnd-
1e590 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e5a0 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45  GE );.    startE
1e5b0 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74  q = !pRangeStart
1e5c0 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d   || pRangeStart-
1e5d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1e5e0 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
1e5f0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
1e600 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
1e610 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
1e620 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
1e630 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1e640 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72  nts = pRangeStar
1e650 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20  t || nEq>0;..   
1e660 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64   /* Seek the ind
1e670 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  ex cursor to the
1e680 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61   start of the ra
1e690 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  nge. */.    nCon
1e6a0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
1e6b0 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
1e6c0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1e6d0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1e6e0 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
1e6f0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1e700 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e710 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1e720 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1e730 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72   if( (pRangeStar
1e740 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1e750 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
1e760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e770 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
1e780 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
1e790 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
1e7a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e7b0 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
1e7c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1e7d0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1e7e0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74  nity(pRight, zSt
1e7f0 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  artAff[nEq])==SQ
1e800 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
1e810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
1e820 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
1e830 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
1e840 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
1e850 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
1e860 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
1e870 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
1e880 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
1e890 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
1e8a0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
1e8b0 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
1e8c0 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
1e8d0 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
1e8e0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1e8f0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1e900 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e910 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1e920 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1e930 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
1e940 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
1e950 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
1e960 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1e970 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1e980 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
1e990 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1e9a0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1e9b0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
1e9c0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e9d0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1e9e0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
1e9f0 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75  else if( isMinQu
1ea00 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ery ){.      sql
1ea10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ea20 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1ea30 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1ea40 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1ea50 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1ea60 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1ea70 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1ea80 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1ea90 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1eaa0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1eab0 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72  onstraint, zStar
1eac0 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1ead0 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1eae0 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1eaf0 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1eb00 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1eb10 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1eb20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1eb30 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
1eb40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1eb50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73  _Last );.    tes
1eb60 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1eb70 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGt );.    test
1eb80 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1eb90 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGe );.    testc
1eba0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1ebb0 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Le );.    testca
1ebc0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1ebd0 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
1ebe0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1ebf0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1ec00 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1ec10 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20  nConstraint);.. 
1ec20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
1ec30 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
1ec40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ec50 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
1ec60 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
1ec70 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
1ec80 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1ec90 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1eca0 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
1ecb0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1ecc0 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
1ecd0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1ece0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ecf0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1ed00 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
1ed10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1ed20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1ed30 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1ed40 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
1ed50 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
1ed60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1ed70 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
1ed80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ed90 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1eda0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
1edb0 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1edc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1edd0 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
1ede0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1edf0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1ee00 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
1ee10 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
1ee20 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
1ee30 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
1ee40 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
1ee50 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
1ee60 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
1ee70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1ee80 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
1ee90 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
1eea0 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
1eeb0 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
1eec0 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
1eed0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
1eee0 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
1eef0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1ef00 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1ef10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ef20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1ef30 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1ef40 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
1ef50 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
1ef60 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
1ef70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1ef80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1ef90 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f      }  .      co
1efa0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1efb0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1efc0 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29   nEq+1, zEndAff)
1efd0 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
1efe0 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
1eff0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1f000 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f010 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
1f020 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
1f030 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
1f040 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1f050 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66  se->db, zStartAf
1f060 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
1f070 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1f080 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20  , zEndAff);..   
1f090 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
1f0a0 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
1f0b0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
1f0c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1f0d0 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  ddr(v);..    /* 
1f0e0 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64  Check if the ind
1f0f0 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  ex cursor is pas
1f100 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1f110 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f   range. */.    o
1f120 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e  p = aEndOp[(pRan
1f130 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20  geEnd || nEq) * 
1f140 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20  (1 + bRev)];.   
1f150 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1f160 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65  P_Noop );.    te
1f170 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1f180 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  dxGE );.    test
1f190 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
1f1a0 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  LT );.    if( op
1f1b0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1f1c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f1d0 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
1f1e0 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
1f1f0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
1f200 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  raint);.      sq
1f210 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1f220 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76  5(v, endEq!=bRev
1f230 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   ?1:0);.    }.. 
1f240 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1f250 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
1f260 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
1f270 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
1f280 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
1f290 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
1f2a0 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1f2b0 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
1f2c0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20  NULL..    ** If 
1f2d0 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
1f2e0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1f2f0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
1f300 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73     */.    r1 = s
1f310 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1f320 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65  (pParse);.    te
1f330 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
1f340 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1f350 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1f360 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f370 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
1f390 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
1f3a0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1f3b0 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
1f3c0 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
1f3d0 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20  IMIT))!=0 ){.   
1f3e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f3f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1f400 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
1f410 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
1f420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f430 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
1f440 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
1f450 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1f460 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f470 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
1f480 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
1f490 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
1f4a0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
1f4b0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
1f4c0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1f4d0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1f4e0 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
1f4f0 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
1f500 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
1f510 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1f520 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1f530 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1f540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f560 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
1f570 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1f580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f590 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1f5a0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1f5b0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1f5c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f5d0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
1f5e0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
1f5f0 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
1f600 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
1f610 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
1f620 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
1f630 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
1f640 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
1f650 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
1f660 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
1f670 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
1f680 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
1f690 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1f6a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1f6b0 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20  HERE_UNIQUE ){. 
1f6c0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1f6d0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
1f6e0 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
1f6f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1f700 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
1f710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
1f720 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
1f730 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
1f740 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
1f750 75 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  ur;.    if( pLoo
1f760 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1f770 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b  RE_COVER_SCAN ){
1f780 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1f790 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
1f7a0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
1f7b0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
1f7c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1f7d0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1f7e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
1f7f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f800 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1f810 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
1f820 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
1f830 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
1f840 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
1f850 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
1f860 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
1f870 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
1f880 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1f890 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f8a0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
1f8b0 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
1f8c0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1f8d0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1f8e0 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
1f8f0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
1f900 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
1f910 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
1f920 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
1f930 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1f940 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1f950 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
1f960 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
1f970 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
1f980 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
1f990 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
1f9a0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1f9b0 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
1f9c0 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
1f9d0 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
1f9e0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1f9f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1fa00 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1fa10 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1fa20 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1fa30 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
1fa40 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
1fa50 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
1fa60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
1fa70 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
1fa80 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
1fa90 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
1faa0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1fab0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
1fac0 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
1fad0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
1fae0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
1faf0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
1fb00 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
1fb10 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
1fb20 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
1fb30 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
1fb40 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
1fb50 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
1fb60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
1fb70 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fb80 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
1fb90 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
1fba0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1fbb0 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
1fbc0 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
1fbd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1fbe0 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
1fbf0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1fc00 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
1fc10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
1fc20 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
1fc30 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
1fc40 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
1fc50 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
1fc60 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
1fc70 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
1fc80 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
1fc90 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
1fca0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
1fcb0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1fcc0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1fce0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1fcf0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1fd00 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
1fd10 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
1fd20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
1fd30 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
1fd40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1fd50 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
1fd80 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
1fd90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fda0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
1fdc0 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1fdd0 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
1fde0 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
1fdf0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
1fe00 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
1fe10 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
1fe20 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
1fe30 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
1fe40 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
1fe50 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
1fe60 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
1fe70 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
1fe80 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
1fe90 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
1fea0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
1feb0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
1fec0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
1fed0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
1fee0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
1fef0 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
1ff00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
1ff10 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
1ff20 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
1ff30 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
1ff40 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
1ff50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
1ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1ff70 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
1ff80 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
1ff90 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
1ffa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1ffc0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
1ffd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
1ffe0 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
20010 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
20020 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
20030 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
20040 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20050 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
20060 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
20070 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
200a0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
200b0 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
200c0 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
200d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
200e0 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
200f0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
20100 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
20110 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20130 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20140 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
20150 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
20160 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
20170 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
20180 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
20190 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
201a0 70 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  p->aTerm[0];.   
201b0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
201c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
201d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
201e0 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  r & WO_OR );.   
201f0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
20200 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20210 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
20220 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
20230 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
20240 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
20250 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
20260 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
20270 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
20280 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
20290 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20  cList in pOrTab 
202a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
202b0 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
202c0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
202d0 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
202e0 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
202f0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
20300 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
20310 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
20320 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
20330 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
20340 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
20350 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
20360 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
20370 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
20380 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
20390 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
203a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
203b0 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
203c0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
203d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
203e0 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
203f0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
20400 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
20410 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
20420 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
20430 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
20440 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
20450 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
20460 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Raw(pParse->db,.
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
20490 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
204a0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
204b0 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
204c0 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
204d0 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
204e0 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
204f0 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36  b->nAlloc = (i16
20500 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
20510 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
20520 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
20530 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
20540 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
20550 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
20560 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
20570 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
20580 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
20590 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
205a0 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
205b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
205c0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
205d0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
205e0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
205f0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
20600 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
20610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
20620 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
20630 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
20640 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20650 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
20660 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
20670 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
20680 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
20690 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
206a0 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
206b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
206c0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
206d0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
206e0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
206f0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
20700 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
20710 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
20720 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
20730 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
20740 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
20750 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
20760 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
20770 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
20780 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
20790 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
207a0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
207b0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
207c0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
207d0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
207e0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
207f0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
20800 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
20810 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
20820 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
20830 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
20840 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
20850 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
20860 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
20870 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
20880 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
20890 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
208a0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
208b0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
208c0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
208d0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
208e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
208f0 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
20900 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
20930 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
20940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
20950 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
20960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20970 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
20980 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
20990 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
209a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
209b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
209c0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
209d0 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
209e0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
209f0 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
20a00 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
20a10 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
20a20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
20a30 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
20a40 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
20a50 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
20a60 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
20a70 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
20a80 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
20a90 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
20aa0 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
20ab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
20ac0 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
20ad0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
20ae0 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
20af0 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
20b00 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
20b10 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
20b20 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
20b30 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
20b40 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
20b50 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
20b60 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
20b70 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
20b80 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
20b90 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
20ba0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20bb0 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
20bc0 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
20bd0 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
20be0 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
20bf0 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
20c00 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
20c10 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
20c20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
20c30 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
20c40 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
20c50 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
20c60 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
20c70 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
20c80 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
20c90 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
20ca0 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
20cb0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
20cc0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
20cd0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
20ce0 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
20cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
20d00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20d10 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
20d20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20d30 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b       if( pWC->a[
20d40 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
20d50 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
20d60 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
20d70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20d80 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
20d90 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
20da0 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
20db0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
20dc0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
20dd0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
20de0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
20df0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
20e00 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
20e10 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
20e20 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
20e30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
20e40 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
20e50 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
20e60 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
20e70 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
20e80 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
20e90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
20ea0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
20eb0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
20ec0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
20ed0 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
20ee0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
20ef0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
20f00 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
20f10 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
20f20 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
20f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
20f40 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
20f50 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
20f60 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
20f70 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
20f80 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
20f90 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
20fa0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
20fb0 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21  f( pAndExpr && !
20fc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20fd0 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  pOrExpr, EP_From
20fe0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
20ff0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
21000 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
21010 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
21020 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
21030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
21040 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
21050 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
21060 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
21070 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
21080 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
21090 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
210a0 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
210b0 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
210e0 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45  OPEN_CLOSE | WHE
210f0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20  RE_AND_ONLY |.  
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
21120 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
21130 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69  ONETABLE_ONLY, i
21140 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
21150 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
21160 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
21170 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
21180 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
21190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
211a0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
211b0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
211c0 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
211d0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
211e0 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
211f0 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
21200 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
21210 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
21220 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
21230 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21240 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
21250 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
21260 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
21270 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
21280 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
21290 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
212a0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
212b0 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
212c0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
212d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
212e0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
212f0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
21300 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
21330 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
21340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21350 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
21360 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
21370 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
213a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
213b0 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
213c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
213d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
213e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
213f0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
21400 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
21410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21420 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
21430 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
21440 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
21450 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
21460 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
21470 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
21480 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
21490 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
214a0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
214b0 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
214c0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
214d0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
214e0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
214f0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
21500 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
21510 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21520 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
21530 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
21540 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
21550 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
21560 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
21570 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
21580 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
21590 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
215a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
215b0 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
215c0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
215d0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
215e0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
215f0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
21600 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
21610 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
21620 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
21630 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
21640 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
21650 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
21660 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
21670 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
21680 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
21690 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
216a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
216b0 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
216c0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
216d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
216e0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
216f0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
21700 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
21710 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
21720 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
21730 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
21740 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
21750 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
21760 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
21770 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
21780 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
21790 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
217a0 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
217b0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
217c0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
217d0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
217e0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
217f0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
21800 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
21810 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
21820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21830 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
21840 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
21850 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
21860 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d    if( (pSubLoop-
21870 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21880 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
21890 20 20 20 20 20 20 20 20 26 26 20 28 70 53 75 62          && (pSub
218a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
218b0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
218c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
218d0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
218e0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
218f0 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
21900 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
21920 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
21930 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
21940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
21950 6f 76 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ov = pLoop->u.bt
21960 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
21970 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21980 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
21990 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
219a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
219b0 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
219c0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
219d0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
219e0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
219f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21a00 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
21a10 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
21a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21a30 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
21a40 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
21a50 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
21a60 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
21a70 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
21a80 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
21a90 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
21aa0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
21ab0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
21ac0 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
21ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21ae0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
21af0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
21b00 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
21b10 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
21b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21b30 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
21b40 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
21b50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21b60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21b70 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
21b80 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
21b90 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
21ba0 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d  tackFree(pParse-
21bb0 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  >db, pOrTab);.  
21bc0 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
21bd0 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
21be0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
21bf0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
21c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
21c10 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
21c20 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
21c30 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
21c40 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
21c50 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
21c60 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
21c70 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
21c80 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
21c90 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
21ca0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
21cb0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
21cc0 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
21cd0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
21ce0 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
21cf0 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
21d00 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
21d10 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
21d20 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76  v==1 );.    pLev
21d30 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
21d40 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
21d50 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
21d60 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
21d70 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
21d80 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
21d90 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
21da0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
21db0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
21dc0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
21dd0 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77  _STEP;.  }.  new
21de0 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  NotReady = notRe
21df0 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 70  ady & ~getMask(p
21e00 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
21e10 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
21e20 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
21e30 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
21e40 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
21e50 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
21e60 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
21e70 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
21e80 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
21e90 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
21ea0 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30  N-OF: R-49525-50
21eb0 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63  935 Terms that c
21ec0 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69  annot be satisfi
21ed0 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
21ee0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63  the use of indic
21ef0 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20  es become tests 
21f00 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74  that are evaluat
21f10 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20  ed against each 
21f20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  row of.  ** the 
21f30 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74  relevant input t
21f40 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
21f50 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
21f60 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
21f70 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
21f80 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
21f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
21fa0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21fb0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
21fc0 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31  * IMP: R-30575-1
21fd0 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74  1662 */.    test
21fe0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
21ff0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
22000 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
22010 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22020 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
22030 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
22040 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
22050 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
22060 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
22070 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
22080 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
22090 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
220a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
220b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
220c0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
220d0 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
220e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
220f0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
22100 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22110 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
22120 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22130 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
22140 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
22150 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
22160 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22170 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
22180 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
22190 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
221a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
221b0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
221c0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
221d0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
221e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
221f0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
22200 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
22210 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69  de to test for i
22220 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e  mplied constrain
22230 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e  ts based on tran
22240 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66  sitivity.  ** of
22250 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74   the "==" operat
22260 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  or..  **.  ** Ex
22270 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48  ample: If the WH
22280 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
22290 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  ins "t1.a=t2.b" 
222a0 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20  and "t2.b=123". 
222b0 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63   ** and we are c
222c0 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f  oding the t1 loo
222d0 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f  p and the t2 loo
222e0 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f  p has not yet co
222f0 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ded,.  ** then w
22300 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
22310 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e   "t1.a=t2.b" con
22320 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20  straint, but we 
22330 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68  can code.  ** th
22340 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d  e implied "t1.a=
22350 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e  123" constraint.
22360 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
22370 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
22380 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
22390 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
223a0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 57 68  Expr *pE;.    Wh
223b0 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20  ereTerm *pAlt;. 
223c0 20 20 20 45 78 70 72 20 73 45 71 3b 0a 20 20 20     Expr sEq;.   
223d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
223e0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
223f0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
22400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22410 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
22420 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c  ator!=(WO_EQUIV|
22430 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75  WO_EQ) ) continu
22440 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
22450 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
22460 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
22470 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
22480 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
22490 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
224a0 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
224b0 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  in) );.    asser
224c0 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  t( (pTerm->prere
224d0 71 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52  qRight & newNotR
224e0 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
224f0 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  pAlt = findTerm(
22500 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d  pWC, iCur, pTerm
22510 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20  ->u.leftColumn, 
22520 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
22530 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IN, 0);.    i
22540 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
22550 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
22560 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
22570 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
22580 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56 64 62 65  ntinue;.    Vdbe
22590 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
225a0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
225b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
225c0 0a 20 20 20 20 73 45 71 20 3d 20 2a 70 41 6c 74  .    sEq = *pAlt
225d0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73 45 71  ->pExpr;.    sEq
225e0 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  .pLeft = pE->pLe
225f0 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ft;.    sqlite3E
22600 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
22610 65 2c 20 26 73 45 71 2c 20 61 64 64 72 43 6f 6e  e, &sEq, addrCon
22620 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
22630 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NULL);.  }..  /*
22640 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
22650 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
22660 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
22670 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
22680 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61  that.  ** at lea
22690 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
226a0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
226b0 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
226c0 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f  ft table.  .  */
226d0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
226e0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
226f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
22700 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
22710 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
22720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22730 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
22740 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
22750 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
22760 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22770 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
22780 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c   hit"));.    sql
22790 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
227a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
227b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
227c0 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54  , j=0; j<pWC->nT
227d0 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
227e0 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  +){.      testca
227f0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
22800 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
22810 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  L );  /* IMP: R-
22820 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
22830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22840 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22850 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
22860 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
22870 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
22880 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
22890 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
228a0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
228b0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
228c0 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
228d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
228e0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
228f0 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
22900 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22910 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
22920 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
22930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22940 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22950 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
22960 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
22970 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22980 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
22990 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
229a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
229b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
229c0 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
229d0 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
229e0 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b  urn newNotReady;
229f0 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
22a00 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
22a10 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
22a20 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
22a30 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
22a40 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
22a50 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
22a60 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
22a70 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
22a80 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 32  t){.  int nb = 2
22a90 2a 28 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  *((pTabList->nSr
22aa0 63 2b 31 35 29 2f 31 36 29 3b 0a 20 20 73 74 72  c+15)/16);.  str
22ab0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22ac0 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69   *pItem = pTabLi
22ad0 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
22ae0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
22af0 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
22b00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22b10 74 66 28 22 25 63 20 25 32 64 2e 25 30 2a 6c 6c  tf("%c %2d.%0*ll
22b20 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
22b30 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
22b40 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
22b50 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
22b60 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29  , nb, p->prereq)
22b70 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
22b80 50 72 69 6e 74 66 28 22 20 25 38 73 22 2c 0a 20  Printf(" %8s",. 
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
22bb0 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s ? pItem->zAlia
22bc0 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s : pTab->zName)
22bd0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
22be0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
22bf0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
22c00 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
22c10 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  ee.pIndex ){.   
22c20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22c30 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65  Name = p->u.btre
22c40 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  e.pIndex->zName;
22c50 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
22c60 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
22c70 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
22c80 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
22c90 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
22ca0 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
22cb0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
22cc0 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
22cd0 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
22ce0 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
22cf0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
22d00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
22d10 25 2d 31 32 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-12s %2d", zNam
22d20 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
22d30 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
22d40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
22d50 67 50 72 69 6e 74 66 28 22 25 31 36 73 22 2c 22  gPrintf("%16s","
22d60 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
22d70 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
22d80 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
22d90 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
22da0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
22db0 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
22dc0 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
22dd0 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
22de0 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
22df0 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
22e00 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
22e10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22e20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
22e30 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
22e40 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
22e50 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
22e60 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
22e70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22e80 69 6e 74 66 28 22 20 25 2d 31 35 73 22 2c 20 7a  intf(" %-15s", z
22e90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22ea0 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
22eb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22ec0 28 22 20 66 67 20 25 30 35 78 20 4e 20 25 64 22  (" fg %05x N %d"
22ed0 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
22ee0 3e 6e 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  >nTerm);.  sqlit
22ef0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
22f00 63 6f 73 74 20 25 2e 32 67 2c 25 2e 32 67 2c 25  cost %.2g,%.2g,%
22f10 2e 32 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .2g\n",.        
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22f30 70 72 65 72 65 71 2c 20 70 2d 3e 72 53 65 74 75  prereq, p->rSetu
22f40 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
22f50 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
22f60 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
22f70 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
22f80 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
22f90 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
22fa0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22fb0 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
22fc0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
22fd0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 44   *p){.  sqlite3D
22fe0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 54 65  bFree(db, p->aTe
22ff0 72 6d 29 3b 0a 20 20 70 2d 3e 61 54 65 72 6d 20  rm);.  p->aTerm 
23000 3d 20 30 3b 0a 20 20 70 2d 3e 6e 54 65 72 6d 20  = 0;.  p->nTerm 
23010 3d 20 30 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  = 0;.  if( (p->w
23020 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
23030 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
23040 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ){.    if( p->u.
23050 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 20  vtab.needFree ) 
23060 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23070 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
23080 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65      p->u.vtab.ne
23090 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
230a0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
230b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
230c0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
230d0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
230e0 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
230f0 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
23100 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23110 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
23120 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
23130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23140 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
23150 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
23160 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
23170 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ex = 0;.  }.}../
23180 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
23190 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
231a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
231b0 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
231c0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
231d0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
231e0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
231f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
23200 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
23210 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
23220 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
23230 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
23240 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
23250 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
23260 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
23270 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
23280 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
23290 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f  auseClear(pWInfo
232a0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->pWC);.    whil
232b0 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
232c0 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
232d0 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
232e0 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
232f0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
23300 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
23310 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
23320 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
23330 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23340 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
23350 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
23360 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
23370 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
23380 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
23390 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
233a0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
233b0 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
233c0 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
233d0 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
233e0 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
233f0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
23400 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
23410 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
23420 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
23430 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
23440 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
23450 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
23460 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
23470 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
23480 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
23490 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
234a0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
234b0 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
234c0 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
234d0 64 20 6e 6f 20 74 68 65 20 74 65 6d 70 6c 61 74  d no the templat
234e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
234f0 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 6e  lder->pBest is n
23500 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
23510 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
23520 74 68 65 20 76 65 72 79 0a 2a 2a 20 62 65 73 74  the very.** best
23530 20 74 65 6d 70 6c 61 74 65 20 61 6e 64 20 74 68   template and th
23540 61 74 20 74 65 6d 70 6c 61 74 65 20 73 68 6f 75  at template shou
23550 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
23560 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2e  pBuilder->pBest.
23570 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
23580 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 20 74  >pBest is NULL t
23590 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68  hen a list of th
235a0 65 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65 73  e best templates
235b0 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
235c0 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  n pBuilder->pWIn
235d0 66 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a 2a 0a 2a  fo->pLoops..**.*
235e0 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
235f0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
23600 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
23610 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c  r->pBest is NULL
23620 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
23630 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
23640 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
23650 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
23660 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70  e if the.** temp
23670 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
23680 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
23690 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
236a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
236b0 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
236c0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
236d0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
236e0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
236f0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
23700 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
23710 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
23720 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
23730 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
23740 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
23750 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
23760 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
23770 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
23780 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
23790 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
237a0 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
237b0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
237c0 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
237d0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
237e0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
237f0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
23800 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
23810 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 2c 20 2a  p, *pNext = 0, *
23820 70 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 57  pToFree = 0;.  W
23830 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 54 65 72  hereTerm **paTer
23840 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
23850 20 2a 64 62 20 3d 20 70 42 75 69 6c 64 65 72 2d   *db = pBuilder-
23860 3e 64 62 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  >db;.  WhereInfo
23870 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
23880 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 0a 20 20  der->pWInfo;..  
23890 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
238a0 70 42 65 73 74 20 69 73 20 64 65 66 69 6e 65 64  pBest is defined
238b0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70  , then only keep
238c0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 73 69   track of the si
238d0 6e 67 6c 65 0a 20 20 2a 2a 20 62 65 73 74 20 57  ngle.  ** best W
238e0 68 65 72 65 4c 6f 6f 70 2e 20 20 70 42 75 69 6c  hereLoop.  pBuil
238f0 64 65 72 2d 3e 70 42 65 73 74 2d 3e 6d 61 73 6b  der->pBest->mask
23900 53 65 6c 66 3d 3d 30 20 69 6e 64 69 63 61 74 65  Self==0 indicate
23910 73 20 74 68 61 74 20 6e 6f 0a 20 20 2a 2a 20 70  s that no.  ** p
23920 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
23930 68 61 76 65 20 62 65 65 6e 20 65 76 61 6c 75 61  have been evalua
23940 74 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65  ted and that the
23950 20 63 75 72 72 65 6e 74 20 70 54 65 6d 70 6c 61   current pTempla
23960 74 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  te.  ** is there
23970 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 61  fore the first a
23980 6e 64 20 68 65 6e 63 65 20 74 68 65 20 62 65 73  nd hence the bes
23990 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  t and should be 
239a0 72 65 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  retained..  */. 
239b0 20 69 66 28 20 28 70 20 3d 20 70 42 75 69 6c 64   if( (p = pBuild
239c0 65 72 2d 3e 70 42 65 73 74 29 21 3d 30 20 29 7b  er->pBest)!=0 ){
239d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 73 6b  .    if( p->mask
239e0 53 65 6c 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  Self!=0 ){.     
239f0 20 69 66 28 20 70 2d 3e 72 52 75 6e 2b 70 2d 3e   if( p->rRun+p->
23a00 72 53 65 74 75 70 20 3c 20 70 54 65 6d 70 6c 61  rSetup < pTempla
23a10 74 65 2d 3e 72 52 75 6e 2b 70 54 65 6d 70 6c 61  te->rRun+pTempla
23a20 74 65 2d 3e 72 53 65 74 75 70 20 29 7b 0a 20 20  te->rSetup ){.  
23a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23a40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
23a50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75        if( p->rRu
23a60 6e 2b 70 2d 3e 72 53 65 74 75 70 20 3d 3d 20 70  n+p->rSetup == p
23a70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70  Template->rRun+p
23a80 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23a90 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72  .       && p->pr
23aa0 65 72 65 71 20 3c 3d 20 70 54 65 6d 70 6c 61 74  ereq <= pTemplat
23ab0 65 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20  e->prereq ){.   
23ac0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23ad0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
23ae0 20 20 20 7d 0a 20 20 20 20 2a 70 20 3d 20 2a 70     }.    *p = *p
23af0 54 65 6d 70 6c 61 74 65 3b 0a 20 20 20 20 70 2d  Template;.    p-
23b00 3e 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  >aTerm = 0;.    
23b10 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
23b20 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ee = 0;.    retu
23b30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23b40 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
23b50 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
23b60 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72  hereLoop to over
23b70 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20  write, or which 
23b80 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72  takes.  ** prior
23b90 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61  ity over pTempla
23ba0 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  te..  */.  for(p
23bb0 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70  pPrev=&pWInfo->p
23bc0 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76  Loops, p=*ppPrev
23bd0 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
23be0 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
23bf0 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
23c00 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
23c10 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
23c20 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
23c30 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 20 63 6f  e->iSortIdx ) co
23c40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23c50 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
23c60 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
23c70 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20  =p->prereq.     
23c80 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
23c90 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a  emplate->rSetup.
23ca0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
23cb0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
23cc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
23cd0 20 41 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67   Already holding
23ce0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 62 65 74   an equal or bet
23cf0 74 65 72 20 57 68 65 72 65 4c 6f 6f 70 2e 0a 20  ter WhereLoop.. 
23d00 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77       ** Return w
23d10 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
23d20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69  or adding anythi
23d30 6e 67 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ng */.      retu
23d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23d50 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
23d60 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
23d70 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
23d80 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
23d90 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
23da0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
23db0 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
23dc0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
23dd0 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
23de0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61    /* Overwrite a
23df0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
23e00 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74  Loop with a bett
23e10 65 72 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  er one */.      
23e20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
23e30 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
23e40 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
23e50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23e70 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
23e80 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
23e90 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
23ea0 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
23eb0 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
23ec0 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
23ed0 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
23ee0 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
23ef0 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
23f00 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
23f10 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
23f20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
23f30 20 20 70 20 3d 20 70 54 6f 46 72 65 65 20 3d 20    p = pToFree = 
23f40 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
23f50 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  aw(db, sizeof(Wh
23f60 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
23f70 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
23f80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23f90 20 7d 0a 20 20 69 66 28 20 70 54 65 6d 70 6c 61   }.  if( pTempla
23fa0 74 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20  te->nTerm ){.   
23fb0 20 70 61 54 65 72 6d 20 3d 20 73 71 6c 69 74 65   paTerm = sqlite
23fc0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
23fd0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65 72   pTemplate->nTer
23fe0 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65 72  m*sizeof(p->aTer
23ff0 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  m[0]));.    if( 
24000 70 61 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20  paTerm==0 ){.   
24010 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24020 28 64 62 2c 20 70 54 6f 46 72 65 65 29 3b 0a 20  (db, pToFree);. 
24030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
24050 20 20 7d 0a 20 20 2a 70 20 3d 20 2a 70 54 65 6d    }.  *p = *pTem
24060 70 6c 61 74 65 3b 0a 20 20 70 2d 3e 70 4e 65 78  plate;.  p->pNex
24070 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20  tLoop = pNext;. 
24080 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20   *ppPrev = p;.  
24090 70 2d 3e 61 54 65 72 6d 20 3d 20 70 61 54 65 72  p->aTerm = paTer
240a0 6d 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 65 72  m;.  if( p->nTer
240b0 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  m ){.    memcpy(
240c0 70 2d 3e 61 54 65 72 6d 2c 20 70 54 65 6d 70 6c  p->aTerm, pTempl
240d0 61 74 65 2d 3e 61 54 65 72 6d 2c 20 70 2d 3e 6e  ate->aTerm, p->n
240e0 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Term*sizeof(p->a
240f0 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  Term[0]));.  }. 
24100 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24110 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
24120 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
24130 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
24140 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
24150 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  ex;.    if( pInd
24160 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e  ex && pIndex->tn
24170 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  um==0 ){.      p
24180 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24190 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
241a0 6c 73 65 7b 0a 20 20 20 20 70 54 65 6d 70 6c 61  lse{.    pTempla
241b0 74 65 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  te->u.vtab.needF
241c0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ree = 0;.  }.  r
241d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
241e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  .}../*.** We hav
241f0 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
24200 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
24210 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
24220 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
24230 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74  pIndex..** Try t
24240 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
24250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
24260 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
24270 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
24280 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
24290 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
242a0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
242b0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
242c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
242d0 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
242e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
242f0 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
24300 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
24310 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
24320 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
24330 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
24340 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
24350 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
24360 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
24390 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  pSrc */.  int nI
243a0 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
243b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
243c0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
243d0 73 20 64 75 65 20 74 6f 20 49 4e 20 2a 2f 0a 29  s due to IN */.)
243e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24410 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
24420 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
24430 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24450 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
24460 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
24470 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
24480 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244a0 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
244b0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
244c0 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
244f0 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
24500 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
24510 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24530 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
24540 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  RE terms */.  Wh
24550 65 72 65 4c 6f 6f 70 20 73 61 76 65 64 4c 6f 6f  ereLoop savedLoo
24560 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
24570 20 53 61 76 65 64 20 6f 72 69 67 69 6e 61 6c 20   Saved original 
24580 63 6f 6e 74 65 6e 74 20 6f 66 20 70 4e 65 77 5b  content of pNew[
24590 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ] */.  int iCol;
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
245c0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  of the column in
245d0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
245e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
245f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
24600 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24610 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 52 6f 77  /.  tRowcnt iRow
24620 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Est;            
24630 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
24640 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69   index selectivi
24650 74 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  ty */.  double r
24660 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
24670 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
24680 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
24690 7a 65 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 42  ze */..  db = pB
246a0 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 70 4e  uilder->db;.  pN
246b0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
246c0 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
246d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
246e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
246f0 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  M;..  assert( (p
24700 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
24710 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
24720 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
24730 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
24740 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43  .nEq<=pProbe->nC
24750 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
24760 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
24770 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
24780 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
24790 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
247a0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
247b0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
247c0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
247d0 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65  }else if( pProbe
247e0 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53  ->tnum<=0 || (pS
247f0 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
24800 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
24810 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
24820 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
24830 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
24840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
24850 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
24860 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47  N|WO_ISNULL|WO_G
24870 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
24880 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _LE;.  }.  if( p
24890 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
248a0 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
248b0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
248c0 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66 28  T|WO_LE);..  if(
248d0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
248e0 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f  Eq < pProbe->nCo
248f0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c  lumn ){.    iCol
24900 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
24910 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  umn[pNew->u.btre
24920 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 69 52 6f 77  e.nEq];.    iRow
24930 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Est = pProbe->ai
24940 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62  RowEst[pNew->u.b
24950 74 72 65 65 2e 6e 45 71 2b 31 5d 3b 0a 20 20 7d  tree.nEq+1];.  }
24960 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  else{.    iCol =
24970 20 2d 31 3b 0a 20 20 20 20 69 52 6f 77 45 73 74   -1;.    iRowEst
24980 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
24990 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
249a0 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
249b0 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
249c0 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
249f0 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 4c 6f 6f  obe);.  savedLoo
24a00 70 20 3d 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  p = *pNew;.  pNe
24a10 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75  w->rSetup = (dou
24a20 62 6c 65 29 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  ble)0;.  rLogSiz
24a30 65 20 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62  e = estLog(pProb
24a40 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  e->aiRowEst[0]);
24a50 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
24a60 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
24a70 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
24a80 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
24a90 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  ){.    int nIn =
24aa0 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   1;.    pNew->ws
24ab0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 4c 6f 6f  Flags = savedLoo
24ac0 70 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  p.wsFlags;.    p
24ad0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24ae0 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 75 2e 62   = savedLoop.u.b
24af0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 70 4e  tree.nEq;.    pN
24b00 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 73 61 76 65  ew->nTerm = save
24b10 64 4c 6f 6f 70 2e 6e 54 65 72 6d 3b 0a 20 20 20  dLoop.nTerm;.   
24b20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 54 65 72 6d   if( pNew->nTerm
24b30 3e 3d 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65  >=pBuilder->mxTe
24b40 72 6d 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 52  rm ) break; /* R
24b50 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 20 69  epeated column i
24b60 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 70  n index */.    p
24b70 4e 65 77 2d 3e 61 54 65 72 6d 5b 70 4e 65 77 2d  New->aTerm[pNew-
24b80 3e 6e 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  >nTerm++] = pTer
24b90 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
24ba0 72 65 71 20 3d 20 28 73 61 76 65 64 4c 6f 6f 70  req = (savedLoop
24bb0 2e 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  .prereq | pTerm-
24bc0 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
24bd0 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
24be0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24bf0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24c00 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
24c10 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
24c20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
24c30 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
24c40 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
24c50 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
24c60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24c70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
24c80 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
24c90 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
24ca0 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c    Assume the SEL
24cb0 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
24cc0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ows */.        n
24cd0 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20 20 20 7d  In = 25;.      }
24ce0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
24cf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
24d00 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
24d10 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
24d20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
24d30 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
24d40 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
24d50 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
24d60 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
24d70 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  }.      pNew->u.
24d80 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
24d90 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24da0 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73 74 20  (double)iRowEst 
24db0 2a 20 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a  * nInMul * nIn;.
24dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
24dd0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24de0 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
24df0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
24e00 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
24e10 45 51 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  EQ;.      pNew->
24e20 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
24e30 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
24e40 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73  = (double)iRowEs
24e50 74 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20  t * nInMul;.    
24e60 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
24e70 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24e80 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
24e90 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
24ea0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
24eb0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77  NULL;.      pNew
24ec0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
24ed0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
24ee0 74 20 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f 77  t = (double)iRow
24ef0 45 73 74 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20  Est * nInMul;.  
24f00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
24f10 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24f20 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
24f30 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
24f40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
24f50 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
24f60 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
24f70 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
24f80 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a  vedLoop.nOut/3;.
24f90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
24fa0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24fb0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
24fc0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
24fd0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24fe0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
24ff0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
25000 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
25010 73 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33  savedLoop.nOut/3
25020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
25030 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a  ->rRun = rLogSiz
25040 65 2a 6e 49 6e 3b 20 20 2f 2a 20 43 6f 73 74 20  e*nIn;  /* Cost 
25050 66 6f 72 20 6e 49 6e 20 62 69 6e 61 72 79 20 73  for nIn binary s
25060 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 20 20 69  earches */.    i
25070 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
25080 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
25090 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 20 29 7b  LY|WHERE_IPK) ){
250a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
250b0 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  n += pNew->nOut;
250c0 20 20 2f 2a 20 55 6e 69 74 20 73 74 65 70 20 63    /* Unit step c
250d0 6f 73 74 20 74 6f 20 72 65 61 63 68 20 65 61 63  ost to reach eac
250e0 68 20 72 6f 77 20 2a 2f 0a 20 20 20 20 7d 65 6c  h row */.    }el
250f0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63  se{.      /* Eac
25100 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61  h row involves a
25110 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64   step of the ind
25120 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72  ex, then a binar
25130 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20  y search of.    
25140 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61    ** the main ta
25150 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ble */.      pNe
25160 77 2d 3e 72 52 75 6e 20 2b 3d 20 70 4e 65 77 2d  w->rRun += pNew-
25170 3e 6e 4f 75 74 2a 28 31 20 2b 20 72 4c 6f 67 53  >nOut*(1 + rLogS
25180 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
25190 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
251a0 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72  Out and rRun for
251b0 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c   STAT3 range val
251c0 75 65 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 54 42  ues */.    /* TB
251d0 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 66  D: Adjust nOut f
251e0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  or additional co
251f0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
25200 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
25210 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
25220 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28  pNew);.    if( (
25230 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
25240 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
25250 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
25260 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
25270 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  Probe->nColumn. 
25280 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 7a      && pProbe->z
25290 4e 61 6d 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20  Name!=0.    ){. 
252a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
252b0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
252c0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
252d0 62 65 2c 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29 3b  be, nInMul*nIn);
252e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e  .    }.  }.  *pN
252f0 65 77 20 3d 20 73 61 76 65 64 4c 6f 6f 70 3b 0a  ew = savedLoop;.
25300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25310 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
25320 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
25330 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
25340 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
25350 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
25360 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
25370 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
25380 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
25390 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
253a0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
253b0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
253c0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
253d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
253e0 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
253f0 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
25400 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
25410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
25420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
25430 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
25440 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
25450 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
25460 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
25470 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
25480 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
25490 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
254a0 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 69 3b   iCol;.  int ii;
254b0 0a 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70  ..  if( (pOB = p
254c0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
254d0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
254e0 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65  ;.  iCol = pInde
254f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a  x->aiColumn[0];.
25500 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25510 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
25520 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
25530 72 20 3d 20 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  r = pOB->a[ii].p
25540 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
25550 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
25560 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
25570 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
25580 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
25590 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
255a0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20  ->iColumn==iCol 
255b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
255c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
255d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
255e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
255f0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
25600 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 74 61  ects a single ta
25610 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
25620 77 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  were the table.*
25630 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79  * is idenfied by
25640 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
25650 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
25660 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
25670 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
25680 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
25690 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
256a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
256b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a  reLoopAddBtree(.
256c0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
256d0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a  er *pBuilder, /*
256e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
256f0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
25700 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20  itmask mExtra   
25710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
25720 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65  tra prerequesite
25730 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73  s for using this
25740 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 49   table */.){.  I
25750 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
25760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
25770 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
25780 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
25790 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
257a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
257b0 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
257c0 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
257d0 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e   key */.  tRowcn
257e0 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
257f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
25800 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
25810 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
25820 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
25830 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
25840 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
25850 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
25860 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73  sPk index */.  s
25870 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25880 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
25890 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
258a0 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
258b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
258c0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
258d0 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
258e0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
258f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25900 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
25910 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25920 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
25930 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
25940 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
25950 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
25980 75 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  ue */.  double r
25990 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
259a0 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
259b0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
259c0 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  le */.  double r
259d0 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
259e0 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
259f0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
25a00 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
25a10 62 6c 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ble */.  .  pNew
25a20 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
25a30 77 3b 0a 20 20 70 53 72 63 20 3d 20 70 42 75 69  w;.  pSrc = pBui
25a40 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  lder->pTabList->
25a50 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
25a60 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
25a70 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
25a80 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
25a90 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
25aa0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
25ab0 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
25ac0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
25ad0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
25ae0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
25af0 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
25b00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
25b10 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
25b20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
25b30 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
25b40 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
25b50 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
25b60 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
25b70 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
25b80 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
25b90 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
25ba0 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
25bb0 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
25bc0 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
25bd0 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
25be0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
25bf0 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
25c00 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
25c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25c20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
25c30 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
25c40 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
25c50 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
25c60 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
25c70 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
25c80 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
25c90 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
25ca0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
25cb0 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
25cc0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
25cd0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
25ce0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
25cf0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
25d00 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
25d10 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e   = pSrc->pTab->n
25d20 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
25d30 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
25d40 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
25d50 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
25d60 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
25d70 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
25d80 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
25d90 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
25da0 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
25db0 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
25dc0 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
25dd0 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
25de0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
25df0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25e00 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
25e10 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
25e20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
25e30 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
25e40 65 20 3d 20 28 64 6f 75 62 6c 65 29 70 53 72 63  e = (double)pSrc
25e50 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  ->pTab->nRowEst;
25e60 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
25e70 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20  tLog(rSize);..  
25e80 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
25e90 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
25ea0 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20  Builder->pBest. 
25eb0 20 20 26 26 20 28 70 42 75 69 6c 64 65 72 2d 3e    && (pBuilder->
25ec0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
25ed0 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
25ee0 6e 64 65 78 29 21 3d 30 20 0a 20 20 20 26 26 20  ndex)!=0 .   && 
25ef0 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74  !pSrc->viaCorout
25f00 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ine.   && !pSrc-
25f10 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26  >notIndexed.   &
25f20 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65  & !pSrc->isCorre
25f30 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f  lated.  ){.    /
25f40 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
25f50 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
25f60 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61   */.    WhereCla
25f70 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c  use *pWC = pBuil
25f80 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20 57 68  der->pWC;.    Wh
25f90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
25fa0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
25fb0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
25fc0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
25fd0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
25fe0 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
25ff0 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
26000 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
26010 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
26020 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
26030 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
26040 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
26050 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
26060 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26070 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
26080 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
26090 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
260a0 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54  w->aTerm[0] = pT
260b0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  erm;.        pNe
260c0 77 2d 3e 72 53 65 74 75 70 20 3d 20 32 2a 72 4c  w->rSetup = 2*rL
260d0 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70 54 61  ogSize*pSrc->pTa
260e0 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
260f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
26100 20 28 64 6f 75 62 6c 65 29 31 30 3b 0a 20 20 20   (double)10;.   
26110 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
26120 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 70 4e 65  = rLogSize + pNe
26130 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  w->nOut;.       
26140 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
26150 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
26160 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
26170 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
26180 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
26190 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
261a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
261b0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
261c0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
261d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f   }.  }..  /* Loo
261e0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
261f0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
26200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26210 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
26220 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
26230 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
26240 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26250 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
26260 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  >nTerm = 0;.    
26270 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
26280 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
26290 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65 29 30  etup = (double)0
262a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
262b0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
262c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
262d0 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a  Index = pProbe;.
262e0 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67      b = indexMig
262f0 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
26300 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f  y(pBuilder, pPro
26310 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  be, pSrc->iCurso
26320 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  r);.    if( pPro
26330 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
26340 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
26350 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
26360 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
26370 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
26380 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
26390 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
263a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  */.      pNew->n
263b0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
263c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
263d0 28 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a  (rSize + rLogSiz
263e0 65 29 2a 28 33 2b 62 29 3b 20 2f 2a 20 34 78 20  e)*(3+b); /* 4x 
263f0 70 65 6e 61 6c 74 79 20 66 6f 72 20 61 20 66 75  penalty for a fu
26400 6c 6c 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  ll-scan */.     
26410 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26420 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26430 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
26440 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
26450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
26460 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
26470 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
26480 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
26490 6a 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j=pProbe->nColum
264a0 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
264b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
264c0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
264d0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
264e0 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
264f0 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
26500 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
26510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26520 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  }.      pNew->ws
26530 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
26540 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
26550 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
26560 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
26570 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
26580 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
26590 2f 0a 20 20 20 20 20 20 69 66 28 20 28 6d 3d 3d  /.      if( (m==
265a0 30 20 7c 7c 20 62 29 20 26 26 20 70 50 72 6f 62  0 || b) && pProb
265b0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
265c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
265d0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
265e0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
265f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
26600 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
26610 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
26620 28 6d 3d 3d 30 29 20 3f 20 28 72 53 69 7a 65 20  (m==0) ? (rSize 
26630 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28 31 2b 62  + rLogSize)*(1+b
26640 29 20 3a 20 28 72 53 69 7a 65 2a 72 4c 6f 67 53  ) : (rSize*rLogS
26650 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
26660 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
26670 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
26680 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
26690 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
266a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
266b0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
266c0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
266d0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
266e0 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 1);..    /* If
266f0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
26700 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
26710 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
26720 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
26730 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
26740 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
26750 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
26760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
26780 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
26790 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
267a0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
267b0 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
267c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
267d0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
267e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
267f0 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
26800 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
26810 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
26820 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
26830 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
26840 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
26850 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
26860 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
26870 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
26880 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
26890 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
268a0 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
268b0 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
268c0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
268d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
268e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
268f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
26900 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
26910 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
26920 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
26930 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
26940 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
26950 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
26960 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
26970 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
26980 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
26990 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
269a0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
269b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
269c0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
269d0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
269e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
269f0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
26a00 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
26a10 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
26a20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
26a30 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
26a40 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
26a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26a60 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
26a70 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
26a80 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
26a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26aa0 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
26ab0 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
26ac0 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
26ad0 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26af0 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
26b00 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
26b10 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
26b20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
26b30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26b40 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50 61 72 73  ITE_OK;..  pPars
26b50 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 50  e = pBuilder->pP
26b60 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
26b70 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d  rse->db;.  pWC =
26b80 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
26b90 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
26ba0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
26bb0 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 54 61  = &pBuilder->pTa
26bc0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
26bd0 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
26be0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
26bf0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
26c00 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
26c10 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
26c20 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
26c30 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
26c40 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
26c50 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
26c60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
26c70 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
26c80 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
26c90 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
26ca0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26cb0 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
26cc0 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 54  ABLE;.  pNew->nT
26cd0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
26ce0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
26cf0 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
26d00 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
26d10 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 0a 20 20  traintUsage;..  
26d20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
26d30 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
26d40 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
26d50 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
26d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
26d70 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
26d80 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
26d90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
26da0 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
26db0 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
26dc0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
26dd0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
26de0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
26df0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
26e00 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
26e10 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
26e20 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
26e30 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
26e40 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
26e50 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
26e60 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
26e70 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
26e80 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
26e90 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
26ea0 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
26eb0 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
26ec0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
26ed0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
26ee0 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
26ef0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
26f00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
26f10 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
26f20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
26f30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
26f40 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 70  lse if( pTerm->p
26f50 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b  rereqRight!=0 ){
26f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
26f70 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
26f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26f90 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
26fa0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
26fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26fc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26fd0 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
26fe0 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
26ff0 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
27000 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27010 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
27020 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
27030 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
27040 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
27050 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27060 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
27070 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
27080 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
27090 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
270a0 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
270b0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
270c0 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
270d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
270e0 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
270f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27100 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
27110 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
27120 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
27130 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
27140 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
27150 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
27160 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
27170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27180 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
27190 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
271a0 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
271b0 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
271c0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
271d0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
271e0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
271f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
27200 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
27210 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
27220 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
27230 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
27240 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
27250 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
27260 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
27270 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
27280 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f  sumed = 0;.    /
27290 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e  * ((double)2) In
272a0 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
272b0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
272c0 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49  INT... */.    pI
272d0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
272e0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
272f0 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c  IG_DBL / ((doubl
27300 65 29 32 29 3b 0a 20 20 20 20 72 63 20 3d 20 76  e)2);.    rc = v
27310 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
27320 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
27330 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
27340 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f   ) goto whereLoo
27350 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
27360 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
27370 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
27380 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
27390 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
273a0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e  nstraint;.    pN
273b0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
273c0 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
273d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
273e0 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d  pBuilder->mxTerm
273f0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 54 65  ; i++) pNew->aTe
27400 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
27410 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
27420 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
27430 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
27440 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
27450 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
27460 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65  {.      if( (iTe
27470 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
27480 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
27490 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
274a0 69 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72 2d  iTerm>=pBuilder-
274b0 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  >mxTerm ) break;
274c0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
274d0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
274e0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
274f0 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e 66 6f 2d  iTerm>=pIdxInfo-
27500 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  >nConstraint.   
27510 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
27520 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
27530 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
27540 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69  || pNew->aTerm[i
27550 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
27560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27570 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27580 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27590 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
275a0 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
275b0 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
275c0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
275d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
275e0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
275f0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
27600 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
27610 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
27620 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
27630 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
27640 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
27650 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 54 65 72  pNew->aTerm[iTer
27660 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
27670 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
27680 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
27690 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
276a0 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
276b0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
276c0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
276d0 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 3b 0a 20  tMask |= 1<<i;. 
276e0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
276f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27700 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
27710 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
27720 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
27730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
27740 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
27750 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
27760 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
27770 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
27780 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
27790 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
277a0 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
277b0 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
277c0 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
277d0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
277e0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
277f0 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
27800 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
27810 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
27820 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
27830 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
27840 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
27850 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
27860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
27870 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
27880 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
27890 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
278a0 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
278b0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
278c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
278d0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
278e0 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
278f0 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
27900 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
27910 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
27920 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
27930 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
27940 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
27950 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
27960 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
27970 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
27980 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
27990 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
279a0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
279b0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
279c0 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
279d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
279e0 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
279f0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
27a00 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
27a10 3e 6e 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  >nTerm = mxTerm+
27a20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  1;.      pNew->u
27a30 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
27a40 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
27a50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
27a60 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
27a70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
27a80 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
27a90 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
27aa0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
27ab0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
27ac0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
27ad0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
27ae0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
27af0 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75  b.isOrdered = (u
27b00 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  8)(pIdxInfo->nOr
27b10 64 65 72 42 79 21 3d 30 29 3b 0a 20 20 20 20 20  derBy!=0);.     
27b20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27b30 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20 20  (double)0;.     
27b40 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 70 49   pNew->rRun = pI
27b50 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
27b60 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70 4e 65  dCost;.      pNe
27b70 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62 6c  w->nOut = (doubl
27b80 65 29 32 35 3b 0a 20 20 20 20 20 20 77 68 65 72  e)25;.      wher
27b90 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
27ba0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
27bb0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
27bc0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
27bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27be0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
27bf0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
27c00 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
27c10 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
27c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
27c30 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
27c40 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
27c50 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
27c60 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
27c70 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
27c80 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
27c90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27ca0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
27cb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27cc0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
27cd0 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
27ce0 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
27cf0 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
27d00 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
27d10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
27d20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
27d30 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65  ereLoopAddOr(Whe
27d40 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27d50 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b  Builder, Bitmask
27d60 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72   mExtra){.  Wher
27d70 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
27d80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
27d90 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
27da0 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
27db0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27dc0 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
27dd0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
27de0 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
27df0 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
27e00 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  ld;.  WhereLoop 
27e10 73 42 65 73 74 3b 0a 20 20 73 74 72 75 63 74 20  sBest;.  struct 
27e20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
27e30 74 65 6d 3b 0a 20 20 0a 0a 20 20 70 57 43 20 3d  tem;.  ..  pWC =
27e40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
27e50 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c    if( pWC->wctrl
27e60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e  Flags & WHERE_AN
27e70 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20  D_ONLY ) return 
27e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43  SQLITE_OK;.  pWC
27e90 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
27ea0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
27eb0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
27ec0 65 77 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 42  ew;.  pItem = pB
27ed0 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73 74  uilder->pTabList
27ee0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
27ef0 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
27f00 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 73 53 75  ->iCursor;.  sSu
27f10 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
27f20 65 72 3b 0a 20 20 73 53 75 62 42 75 69 6c 64 2e  er;.  sSubBuild.
27f30 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
27f40 73 53 75 62 42 75 69 6c 64 2e 70 42 65 73 74 20  sSubBuild.pBest 
27f50 3d 20 26 73 42 65 73 74 3b 0a 20 20 74 65 6d 70  = &sBest;.  temp
27f60 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d  WC.pParse = pWC-
27f70 3e 70 50 61 72 73 65 3b 0a 20 20 74 65 6d 70 57  >pParse;.  tempW
27f80 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43  C.pMaskSet = pWC
27f90 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 74 65  ->pMaskSet;.  te
27fa0 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
27fb0 43 3b 0a 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d  C;.  tempWC.op =
27fc0 20 54 4b 5f 41 4e 44 3b 0a 20 20 74 65 6d 70 57   TK_AND;.  tempW
27fd0 43 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  C.wctrlFlags = 0
27fe0 3b 0a 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d  ;.  tempWC.nTerm
27ff0 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 70 54 65   = 1;..  for(pTe
28000 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
28010 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
28020 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
28030 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
28040 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28050 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
28060 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
28070 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
28080 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
28090 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
280a0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
280b0 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
280c0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
280d0 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
280e0 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
280f0 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
28100 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
28110 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
28120 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
28130 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d   double rTotal =
28140 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   0;.      double
28150 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20   nRow = 0;.     
28160 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 20   Bitmask prereq 
28170 3d 20 6d 45 78 74 72 61 3b 0a 0a 0a 20 20 20 20  = mExtra;...    
28180 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
28190 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
281a0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
281b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
281c0 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
281d0 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d  rator& WO_AND)!=
281e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
281f0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
28200 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
28210 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
28220 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
28230 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
28240 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
28250 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
28260 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
28270 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
28280 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
28290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
282a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
282b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 42      }.        sB
282c0 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30  est.maskSelf = 0
282d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  ;.        if( Is
282e0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
282f0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
28300 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28310 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
28320 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
28330 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28340 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
28350 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
28360 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
28370 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
28380 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74         if( sBest
28390 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62  .maskSelf==0 ) b
283a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
283b0 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74  sert( sBest.rSet
283c0 75 70 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 3b  up==(double)0 );
283d0 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20  .        rTotal 
283e0 2b 3d 20 73 42 65 73 74 2e 72 52 75 6e 3b 0a 20  += sBest.rRun;. 
283f0 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
28400 42 65 73 74 2e 6e 4f 75 74 3b 0a 20 20 20 20 20  Best.nOut;.     
28410 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42 65     prereq |= sBe
28420 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  st.prereq;.     
28430 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
28440 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
28450 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d  pNew->aTerm[0] =
28460 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
28470 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
28480 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
28490 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
284a0 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20   = (double)0;.  
284b0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
284c0 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 70   rTotal;.      p
284d0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
284e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
284f0 65 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20  ereq = prereq;. 
28500 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
28510 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
28520 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
28530 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
28540 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
28550 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNew);.    }.  }
28560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28570 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
28580 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
28590 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
285a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
285b0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
285c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
285d0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 42 69  *pBuilder){.  Bi
285e0 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
285f0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
28600 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
28610 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
28620 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c 64  TabList = pBuild
28630 65 72 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  er->pTabList;.  
28640 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28650 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
28660 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
28670 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
28680 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
28690 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20  pBuilder->db;.  
286a0 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
286b0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
286c0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
286d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
286e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
286f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
28700 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
28710 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
28720 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
28730 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77    pBuilder->pNew
28740 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   = pNew = sqlite
28750 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
28760 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
28770 6f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  op));.  if( pNew
28780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
28790 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 42 75  ITE_NOMEM;.  pBu
287a0 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20 3d 20  ilder->mxTerm = 
287b0 70 57 43 2d 3e 6e 54 65 72 6d 2b 31 3b 0a 20 20  pWC->nTerm+1;.  
287c0 77 68 69 6c 65 28 20 70 57 43 2d 3e 70 4f 75 74  while( pWC->pOut
287d0 65 72 20 29 7b 0a 20 20 20 20 70 57 43 20 3d 20  er ){.    pWC = 
287e0 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
287f0 20 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72   pBuilder->mxTer
28800 6d 20 2b 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  m += pWC->nTerm;
28810 0a 20 20 7d 0a 20 20 70 57 43 20 3d 20 70 42 75  .  }.  pWC = pBu
28820 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
28830 65 77 2d 3e 61 54 65 72 6d 20 3d 20 73 71 6c 69  ew->aTerm = sqli
28840 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
28850 64 62 2c 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54  db,pBuilder->mxT
28860 65 72 6d 2a 73 69 7a 65 6f 66 28 70 4e 65 77 2d  erm*sizeof(pNew-
28870 3e 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69  >aTerm[0]));.  i
28880 66 28 20 70 4e 65 77 2d 3e 61 54 65 72 6d 3d 3d  f( pNew->aTerm==
28890 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
288a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
288b0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
288c0 64 41 6c 6c 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  dAll_end;.  }.  
288d0 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
288e0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
288f0 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
28900 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
28910 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
28920 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
28930 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
28940 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
28950 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
28960 72 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 74  r);.    if( (pIt
28970 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
28980 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
28990 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ))!=0 ){.      m
289a0 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
289b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 73      }.    if( Is
289c0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
289d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63  Tab) ){.      rc
289e0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
289f0 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
28a00 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65   mExtra);.    }e
28a10 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
28a20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
28a30 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
28a40 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
28a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
28a70 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
28a80 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
28a90 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
28aa0 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
28ab0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
28ac0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
28ad0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
28ae0 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c  .whereLoopAddAll
28af0 5f 65 6e 64 3a 0a 20 20 77 68 65 72 65 4c 6f 6f  _end:.  whereLoo
28b00 70 44 65 6c 65 74 65 28 64 62 2c 20 70 42 75 69  pDelete(db, pBui
28b10 6c 64 65 72 2d 3e 70 4e 65 77 29 3b 0a 20 20 70  lder->pNew);.  p
28b20 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d 20  Builder->pNew = 
28b30 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
28b40 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
28b50 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
28b60 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
28b70 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
28b80 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 34 74  reLoop of the 4t
28b90 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
28ba0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
28bb0 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
28bc0 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
28bd0 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
28be0 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
28bf0 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
28c00 74 65 20 73 6f 75 72 63 65 20 6f 70 65 72 61 74  te source operat
28c10 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a  ion.  Return:.**
28c20 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45   .**    0:  ORDE
28c30 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69  R BY is not sati
28c40 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20  sfied.  Sorting 
28c50 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31  required.**    1
28c60 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 73  :  ORDER BY is s
28c70 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f  atisfied.      O
28c80 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20  mit sorting.**  
28c90 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74   -1:  Unknown at
28ca0 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2f   this time.**.*/
28cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
28cc0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
28cd0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
28ce0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
28cf0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
28d00 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  se */.  WherePat
28d10 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
28d20 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
28d30 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
28d40 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
28d50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28d60 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
28d70 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
28d80 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
28d90 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
28da0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
28db0 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
28dc0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
28dd0 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
28de0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 68     /* Mask of Wh
28df0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
28e00 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
28e10 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
28e20 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
28e30 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
28e40 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
28e50 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
28e60 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
28e70 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
28e80 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
28e90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
28ea0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
28eb0 20 69 73 55 6e 69 71 75 65 3b 0a 20 20 75 38 20   isUnique;.  u8 
28ec0 72 65 71 75 69 72 65 55 6e 69 71 75 65 20 3d 20  requireUnique = 
28ed0 30 3b 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e  0;.  u16 nColumn
28ee0 3b 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  ;.  u16 nOrderBy
28ef0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
28f00 69 6e 74 20 6e 55 73 65 64 20 3d 20 30 3b 0a 20  int nUsed = 0;. 
28f10 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
28f20 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 57 68 65 72   iColumn;.  Wher
28f30 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
28f40 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
28f50 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
28f60 64 65 72 42 79 3b 0a 20 20 45 78 70 72 20 2a 70  derBy;.  Expr *p
28f70 4f 42 45 78 70 72 3b 0a 20 20 43 6f 6c 6c 53 65  OBExpr;.  CollSe
28f80 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 49 6e 64 65  q *pColl;.  Inde
28f90 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 73 71 6c  x *pIndex;.  sql
28fa0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
28fb0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
28fc0 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
28fd0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   = 0;..  /*.  **
28fe0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
28ff0 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
29000 77 22 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  w" if all of the
29010 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
29020 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41  rue:.  **  (a) A
29030 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
29040 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52   match with WHER
29050 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a  E_COLUMN_EQ..  *
29060 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78  *  (b) The index
29070 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 0a   is unique.  **.
29080 20 20 2a 2a 20 47 65 6e 65 72 61 6c 20 72 75 6c    ** General rul
29090 65 73 3a 20 20 28 6e 6f 74 20 61 6e 20 61 6c 67  es:  (not an alg
290a0 6f 72 69 74 68 6d 21 29 0a 20 20 2a 2a 0a 20 20  orithm!).  **.  
290b0 2a 2a 20 20 28 31 29 20 49 66 20 74 68 65 20 63  **  (1) If the c
290c0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
290d0 20 69 73 20 6f 6e 65 2d 72 6f 77 2c 20 74 68 65   is one-row, the
290e0 6e 20 6d 61 74 63 68 20 6f 76 65 72 20 61 6e 79  n match over any
290f0 20 61 6e 64 20 61 6c 6c 0a 20 20 2a 2a 20 20 20   and all.  **   
29100 20 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d     ORDER BY term
29110 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
29120 74 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  t WhereLoop and 
29130 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e  proceed to the n
29140 65 78 74 0a 20 20 2a 2a 20 20 20 20 20 20 57 68  ext.  **      Wh
29150 65 72 65 4c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ereLoop..  **.  
29160 2a 2a 20 20 28 32 29 20 49 66 20 74 68 65 20 63  **  (2) If the c
29170 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
29180 20 69 73 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 2c   is not one-row,
29190 20 74 68 65 6e 20 61 6c 6c 20 73 75 62 73 65 71   then all subseq
291a0 75 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20 20 57  uent.  **      W
291b0 68 65 72 65 4c 6f 6f 70 73 20 6d 75 73 74 20 62  hereLoops must b
291c0 65 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 0a  e one-row..  **.
291d0 20 20 2a 2a 20 20 28 33 29 20 4f 70 74 69 6f 6e    **  (3) Option
291e0 61 6c 6c 79 20 6d 61 74 63 68 20 61 6e 79 20 4f  ally match any O
291f0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 61 67  RDER BY terms ag
29200 61 69 6e 73 74 20 74 68 65 20 66 69 72 73 74 20  ainst the first 
29210 6e 45 71 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a  nEq columns.  **
29220 20 20 20 20 20 20 6f 66 20 74 68 65 20 69 6e 64        of the ind
29230 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 28  ex..  **.  **  (
29240 34 29 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  4) Index columns
29250 20 70 61 73 74 20 6e 45 71 20 6d 75 73 74 20 6d   past nEq must m
29260 61 74 63 68 20 4f 52 44 45 52 20 42 59 20 74 65  atch ORDER BY te
29270 72 6d 73 20 6f 6e 65 2d 66 6f 72 2d 6f 6e 65 2e  rms one-for-one.
29280 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
29290 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
292a0 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74  .  /* Sortabilit
292b0 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  y of virtual tab
292c0 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65  les is determine
292d0 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
292e0 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20  dex method.  ** 
292f0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
29300 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20  able itself */. 
29310 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c   if( pLast->wsFl
29320 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
29330 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
29340 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3d 3d 30  assert( nLoop==0
29350 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
29360 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Last->u.vtab.isO
29370 72 64 65 72 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f  rdered;.  }..  /
29380 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 6c 77  * Sorting is alw
29390 61 79 73 20 72 65 71 75 69 72 65 64 20 69 66 20  ays required if 
293a0 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
293b0 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20  ORDER BY is not 
293c0 61 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 72  a .  ** column r
293d0 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 6e 4f  eference */.  nO
293e0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
293f0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  y->nExpr;.  for(
29400 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
29410 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 42 45 78   i++){.    pOBEx
29420 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
29430 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
29440 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
29450 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78  );.    if( pOBEx
29460 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
29470 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
29480 7d 0a 20 20 20 20 0a 20 20 66 6f 72 28 69 3d 30  }.    .  for(i=0
29490 3b 20 69 3c 3d 6e 4c 6f 6f 70 20 26 26 20 6e 55  ; i<=nLoop && nU
294a0 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  sed<nOrderBy; i+
294b0 2b 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  +){.    pLoop = 
294c0 69 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  i<nLoop ? pPath-
294d0 3e 61 4c 6f 6f 70 5b 69 5d 20 3a 20 70 4c 61 73  >aLoop[i] : pLas
294e0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
294f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29500 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
29510 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
29520 73 55 6e 69 71 75 65 20 3d 20 31 3b 0a 20 20 20  sUnique = 1;.   
29530 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
29540 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
29550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  ){.      if( (pL
29560 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
29570 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21  HERE_COLUMN_IN)!
29580 3d 30 20 29 20 69 73 55 6e 69 71 75 65 20 3d 20  =0 ) isUnique = 
29590 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  0;.      if( pLo
295a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 21  op->u.btree.nEq!
295b0 3d 31 20 29 20 69 73 55 6e 69 71 75 65 20 3d 20  =1 ) isUnique = 
295c0 30 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 20  0;.      pIndex 
295d0 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 75  = 0;.      nColu
295e0 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mn = 0;.    }els
295f0 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
29600 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
29610 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
29620 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
29630 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29640 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
29650 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
29660 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
29670 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
29680 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
29690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 55  e ){.        isU
296a0 6e 69 71 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  nique = 0;.     
296b0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f   }else if( (pLoo
296c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
296d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
296e0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
296f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 20 20 7c 57 48 45 52 45 5f 43 4f 4c 55 4d      |WHERE_COLUM
29720 4e 5f 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  N_NULL))!=0 ){. 
29730 20 20 20 20 20 20 20 69 73 55 6e 69 71 75 65 20         isUnique 
29740 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
29750 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   if( pLoop->u.bt
29760 72 65 65 2e 6e 45 71 20 3c 20 70 49 6e 64 65 78  ree.nEq < pIndex
29770 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
29780 20 20 20 20 20 69 73 55 6e 69 71 75 65 20 3d 20       isUnique = 
29790 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
297a0 0a 20 20 20 20 69 66 28 20 21 69 73 55 6e 69 71  .    if( !isUniq
297b0 75 65 20 26 26 20 72 65 71 75 69 72 65 55 6e 69  ue && requireUni
297c0 71 75 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  que ) return 0;.
297d0 20 20 20 20 72 65 71 75 69 72 65 55 6e 69 71 75      requireUniqu
297e0 65 20 3d 20 21 69 73 55 6e 69 71 75 65 3b 0a 20  e = !isUnique;. 
297f0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
29800 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
29810 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
29820 6f 72 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  or;.    j = 0;. 
29830 20 20 20 72 65 76 53 65 74 20 3d 20 72 65 76 20     revSet = rev 
29840 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
29850 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 20 26 26 20  ; j<=nColumn && 
29860 6e 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20  nUsed<nOrderBy; 
29870 6a 2b 2b 2c 20 6e 55 73 65 64 2b 2b 29 7b 0a 20  j++, nUsed++){. 
29880 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
29890 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
298a0 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
298b0 61 5b 6e 55 73 65 64 5d 2e 70 45 78 70 72 29 3b  a[nUsed].pExpr);
298c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
298d0 4f 42 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  OBExpr->op==TK_C
298e0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69  OLUMN );.      i
298f0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
29900 6c 65 21 3d 69 43 75 72 20 29 20 62 72 65 61 6b  le!=iCur ) break
29910 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 55 6e  ;.      if( isUn
29920 69 71 75 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ique ) continue;
29930 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f  .      if( j<nCo
29940 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
29950 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20  /* Normal index 
29960 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
29970 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
29980 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
29990 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78  ;.        revIdx
299a0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
299b0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
299c0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
299d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
299e0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
299f0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
29a00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
29a10 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74   ROWID column at
29a20 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20   the end */.    
29a30 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
29a40 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64 78  ;.        revIdx
29a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
29a60 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
29a70 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
29a80 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
29a90 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
29aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
29ab0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
29ac0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
29ad0 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
29ae0 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e 70 45 78 70  y->a[nUsed].pExp
29af0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
29b00 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
29b10 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
29b20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
29b30 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
29b40 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ->zName, pIndex-
29b50 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
29b60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
29b70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 76   }.      if( rev
29b80 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Set ){.        i
29b90 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
29ba0 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e  )!=pOrderBy->a[n
29bb0 55 73 65 64 5d 2e 73 6f 72 74 4f 72 64 65 72 20  Used].sortOrder 
29bc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
29bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29be0 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
29bf0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 55 73 65  pOrderBy->a[nUse
29c00 64 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  d].sortOrder;.  
29c10 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
29c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29c30 20 20 20 20 69 66 28 20 72 65 76 20 29 20 72 65      if( rev ) re
29c40 76 4d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61  vMask |= ((Bitma
29c50 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 20 20  sk)1)<<i;.  }.  
29c60 69 66 28 20 6e 55 73 65 64 3d 3d 6e 4f 72 64 65  if( nUsed==nOrde
29c70 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 52 65 76  rBy ){.    *pRev
29c80 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
29c90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29ca0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
29cb0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
29cc0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
29cd0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
29ce0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
29cf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
29d00 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
29d10 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
29d20 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
29d30 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
29d40 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
29d50 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
29d60 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
29d70 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
29d80 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
29d90 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
29da0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
29db0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
29dc0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
29dd0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
29de0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
29df0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
29e00 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
29e10 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f 2d  jects on pWInfo-
29e20 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
29e30 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
29e40 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
29e50 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
29e60 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
29e70 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
29e80 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
29e90 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
29ea0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
29eb0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
29ec0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
29ed0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
29ee0 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
29ef0 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
29f00 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
29f10 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
29f20 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
29f30 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
29f40 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 64 6f 75 62  fo *pWInfo, doub
29f50 6c 65 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 63  le nRowEst){.  c
29f60 6f 6e 73 74 20 69 6e 74 20 6d 78 43 68 6f 69 63  onst int mxChoic
29f70 65 20 3d 20 31 30 3b 20 20 2f 2a 20 4d 61 78 69  e = 10;  /* Maxi
29f80 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
29f90 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
29fa0 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
29fb0 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
29fc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29fd0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
29fe0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 73 71 6c 69  e join */.  sqli
29ff0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2a000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2a010 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2a020 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a050 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
2a060 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
2a070 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
2a080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2a090 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2a0a0 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20  double rCost;   
2a0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
2a0c0 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20  t of a path */. 
2a0d0 20 64 6f 75 62 6c 65 20 6d 78 43 6f 73 74 3b 20   double mxCost; 
2a0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2a0f0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
2a100 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2a110 20 20 64 6f 75 62 6c 65 20 72 53 6f 72 74 43 6f    double rSortCo
2a120 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2a130 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74  ost to do a sort
2a140 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
2a150 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2a160 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2a170 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
2a180 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
2a190 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2a1a0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
2a1b0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
2a1c0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
2a1d0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
2a1e0 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
2a1f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
2a200 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
2a210 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
2a220 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2a230 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
2a240 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2a250 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
2a260 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
2a270 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2a280 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
2a290 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
2a2a0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
2a2b0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2a2c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
2a2d0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
2a2e0 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
2a2f0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2a300 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
2a310 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
2a320 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
2a330 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
2a340 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
2a350 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2a360 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
2a370 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
2a380 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 64   routine */..  d
2a390 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2a3a0 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
2a3b0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
2a3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
2a3d0 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
2a3e0 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 23 69 66  ist->nSrc );.#if
2a3f0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2a400 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2a410 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
2a420 32 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  2 ) sqlite3Debug
2a430 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 62 65 67  Printf("---- beg
2a440 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 3b 0a 23  in solver\n");.#
2a450 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  endif..  /* Allo
2a460 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2a470 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
2a480 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20  o and aFrom */. 
2a490 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68   ii = (sizeof(Wh
2a4a0 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
2a4b0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
2a4c0 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
2a4d0 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
2a4e0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
2a4f0 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61   ii);.  if( pSpa
2a500 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
2a510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
2a520 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
2a530 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
2a540 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
2a550 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
2a560 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
2a570 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
2a580 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
2a590 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
2a5a0 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
2a5b0 54 6f 3b 20 69 69 3c 6d 78 43 68 6f 69 63 65 2a  To; ii<mxChoice*
2a5c0 32 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  2; ii++, pFrom++
2a5d0 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
2a5e0 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
2a5f0 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = pX;.  }..  /*
2a600 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
2a610 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
2a620 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
2a630 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
2a640 6f 70 73 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30  ops */.  aFrom[0
2a650 5d 2e 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65  ].nRow = (double
2a660 29 31 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b  )1;.  nFrom = 1;
2a670 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74  ..  /* Precomput
2a680 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  e the cost of so
2a690 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  rting the final 
2a6a0 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74  result set, if t
2a6b0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74  he caller.  ** t
2a6c0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2a6d0 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72  gin() was concer
2a6e0 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e  ned about sortin
2a6f0 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74  g */.  rSortCost
2a700 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20   = (double)0;.  
2a710 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
2a720 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
2a730 73 74 3c 3d 30 2e 30 20 29 7b 0a 20 20 20 20 61  st<=0.0 ){.    a
2a740 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
2a750 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65  dValid = 1;.  }e
2a760 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  lse{.    /* Comp
2a770 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ute an estimate 
2a780 6f 6e 20 74 68 65 20 63 6f 73 74 20 74 6f 20 73  on the cost to s
2a790 6f 72 74 20 74 68 65 20 65 6e 74 69 72 65 20 72  ort the entire r
2a7a0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
2a7b0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
2a7c0 77 45 73 74 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  wEst*estLog(nRow
2a7d0 45 73 74 29 3b 0a 23 69 66 64 65 66 20 57 48 45  Est);.#ifdef WHE
2a7e0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2a7f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2a800 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a  hereTrace>=2 ){.
2a810 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2a820 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 73  ugPrintf("---- s
2a830 6f 72 74 20 63 6f 73 74 3d 25 2d 37 2e 32 67 5c  ort cost=%-7.2g\
2a840 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a  n", rSortCost);.
2a850 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2a860 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
2a870 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
2a880 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
2a890 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
2a8a0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
2a8b0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
2a8c0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
2a8d0 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
2a8e0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
2a8f0 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
2a900 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
2a910 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
2a920 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
2a930 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
2a940 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
2a950 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
2a960 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
2a970 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
2a980 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
2a990 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
2a9a0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
2a9b0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
2a9c0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
2a9d0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
2a9e0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2a9f0 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
2aa00 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
2aa10 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d  edValid = pFrom-
2aa20 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b  >isOrderedValid;
2aa30 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
2aa40 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
2aa50 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
2aa60 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
2aa70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
2aa80 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
2aa90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2aaa0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
2aab0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
2aac0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
2aad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2aae0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2aaf0 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
2ab00 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
2ab10 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
2ab20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
2ab30 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
2ab40 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 70 57        rCost = pW
2ab50 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 20 2b 20 70  Loop->rSetup + p
2ab60 57 4c 6f 6f 70 2d 3e 72 52 75 6e 2a 70 46 72 6f  WLoop->rRun*pFro
2ab70 6d 2d 3e 6e 52 6f 77 20 2b 20 70 46 72 6f 6d 2d  m->nRow + pFrom-
2ab80 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
2ab90 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
2aba0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
2abb0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2abc0 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 72 64        if( !isOrd
2abd0 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
2abe0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 77         switch( w
2abf0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
2ac00 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
2ac10 20 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 0a 20   pFrom, iLoop,. 
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 20 20 20 20 20 20 20 20 20 20 70 57 4c 6f 6f             pWLoo
2ac50 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a  p, &revMask) ){.
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2ac70 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46   1:  /* Yes.  pF
2ac80 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20  rom+pWLoop does 
2ac90 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
2aca0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2acc0 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  rdered = 1;.    
2acd0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2ace0 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2ad00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  k;.            c
2ad10 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20  ase 0:  /* No.  
2ad20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c  pFrom+pWLoop wil
2ad30 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61  l require a sepa
2ad40 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20  rate sort */.   
2ad50 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2ad60 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ered = 0;.      
2ad70 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2ad80 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
2ad90 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
2ada0 2b 3d 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  += rSortCost;.  
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2adc0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  k;.            d
2add0 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f  efault: /* Canno
2ade0 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79  t tell yet.  Try
2adf0 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65   again on the ne
2ae00 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2ae20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2ae30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ae40 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2ae50 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
2ae60 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
2ae70 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73  the mxChoice bes
2ae80 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
2ae90 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
2aea0 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
2aeb0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
2aec0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2aed0 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
2aee0 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65  w && pTo->isOrde
2aef0 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65  redValid==isOrde
2af00 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  redValid ){.    
2af10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2af20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2af30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2af40 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
2af50 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
2af60 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74  xChoice && rCost
2af70 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64  >=mxCost ){.#ifd
2af80 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2af90 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20  ABLE.           
2afa0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2afb0 65 54 72 61 63 65 3e 3d 33 20 29 7b 0a 20 20 20  eTrace>=3 ){.   
2afc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2afd0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
2afe0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
2aff0 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22  7.2g order=%c\n"
2b000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b010 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2b020 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2b030 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2b060 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2b070 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2b080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2b090 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2b0a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2b0b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0c0 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77      /* Add a new
2b0d0 20 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f   Path to the aTo
2b0e0 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  [] set */.      
2b0f0 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
2b100 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
2b110 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
2b120 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
2b130 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
2b140 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
2b150 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
2b160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b170 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
2b180 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
2b190 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
2b1a0 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
2b1b0 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
2b1c0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e          for(jj=n
2b1d0 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43  To-1; aTo[jj].rC
2b1e0 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d  ost<mxCost; jj--
2b1f0 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e 30 29 3b  ){ assert(jj>0);
2b200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2b210 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26           pTo = &
2b220 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20  aTo[jj];.#ifdef 
2b230 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2b240 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ED.          if(
2b250 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2b260 63 65 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  ce>=3 ){.       
2b270 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2b280 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
2b290 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f  %s cost=%-7.2g o
2b2a0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2b2c0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2b2d0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2b2e0 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
2b2f0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2b300 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2b310 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2b320 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2b330 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2b340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b350 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
2b360 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b 0a 23 69  ost<=rCost ){.#i
2b370 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2b380 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
2b390 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2b3a0 68 65 72 65 54 72 61 63 65 3e 3d 33 20 29 7b 0a  hereTrace>=3 ){.
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b3c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2b3d0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2b3e0 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63      "Skip   %s c
2b3f0 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72  ost=%-7.2g order
2b400 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
2b410 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2b420 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
2b430 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
2b440 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2b450 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2b460 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2b470 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2b480 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2b490 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2b4a0 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
2b4b0 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72  s cost=%-7.2g or
2b4c0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2b4e0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
2b4f0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
2b500 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  ->rCost,.       
2b510 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
2b520 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2b530 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
2b540 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2b550 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2b560 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2b570 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2b580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b590 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
2b5a0 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65  and better score
2b5b0 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c   for a previousl
2b5c0 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61  y created equiva
2b5d0 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66  lent path */.#if
2b5e0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2b5f0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20  NABLED.         
2b600 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2b610 65 54 72 61 63 65 3e 3d 33 20 29 7b 0a 20 20 20  eTrace>=3 ){.   
2b620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b630 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
2b650 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 37  date %s cost=%-7
2b660 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  .2g order=%c",. 
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2b680 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2b690 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2b6a0 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
2b6b0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2b6c0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2b6d0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2b6e0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2b6f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2b700 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
2b710 73 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67  s %s cost=%-7.2g
2b720 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2b740 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
2b750 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
2b760 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  o->rCost,.      
2b770 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2b780 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2b790 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2b7a0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2b7b0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
2b7c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2b7d0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
2b7e0 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
2b7f0 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
2b800 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
2b810 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
2b820 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
2b830 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
2b840 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2b850 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2b860 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
2b870 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
2b880 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Row = pFrom->nRo
2b890 77 20 2a 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w * pWLoop->nOut
2b8a0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2b8b0 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
2b8c0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2b8d0 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72  eredValid = isOr
2b8e0 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20  deredValid;.    
2b8f0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2b900 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
2b910 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2b920 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
2b930 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
2b940 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
2b950 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
2b960 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
2b970 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
2b980 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
2b990 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
2b9a0 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
2b9b0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2b9c0 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
2b9d0 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
2b9e0 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
2b9f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2ba00 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
2ba10 6f 73 74 20 29 20 6d 78 43 6f 73 74 20 3d 20 70  ost ) mxCost = p
2ba20 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
2ba30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ba40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ba50 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2ba60 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2ba70 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2ba80 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
2ba90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2baa0 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
2bab0 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
2bac0 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
2bad0 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
2bae0 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
2baf0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2bb00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2bb10 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 37  tf(" %s cost=%-7
2bb20 2e 32 67 20 6e 72 6f 77 3d 25 2d 37 2e 32 67 20  .2g nrow=%-7.2g 
2bb30 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2bb40 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2bb50 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
2bb60 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
2bb70 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
2bb80 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
2bb90 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
2bba0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
2bbb0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2bbc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2bbd0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
2bbe0 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  id && pTo->isOrd
2bbf0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2bc00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2bc10 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
2bc20 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
2bc30 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
2bc40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
2bc50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2bc60 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
2bc70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2bc80 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
2bc90 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
2bca0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
2bcb0 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
2bcc0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
2bcd0 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
2bce0 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
2bcf0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
2bd00 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
2bd10 20 20 7d 0a 0a 20 20 2f 2a 20 54 45 4d 50 4f 52    }..  /* TEMPOR
2bd20 41 52 59 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ARY */.  if( nFr
2bd30 6f 6d 3d 3d 30 20 29 7b 20 73 71 6c 69 74 65 33  om==0 ){ sqlite3
2bd40 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
2bd50 65 29 3b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e); return SQLIT
2bd60 45 5f 45 52 52 4f 52 3b 20 7d 0a 20 20 61 73 73  E_ERROR; }.  ass
2bd70 65 72 74 28 20 6e 46 72 6f 6d 3e 30 20 29 3b 0a  ert( nFrom>0 );.
2bd80 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65    .  /* Find the
2bd90 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
2bda0 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62  h.  pFrom will b
2bdb0 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
2bdc0 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a  to that path */.
2bdd0 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b    pFrom = aFrom;
2bde0 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
2bdf0 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
2be00 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
2be10 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
2be20 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
2be30 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61  rom[ii];.  }.  a
2be40 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
2be50 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a  Level==nLoop );.
2be60 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f    /* Load the lo
2be70 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69  west cost path i
2be80 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20  nto pWInfo */.  
2be90 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
2bea0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
2beb0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
2bec0 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49  el *pLevel = pWI
2bed0 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a  nfo->a + iLoop;.
2bee0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f      pLevel->pWLo
2bef0 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46  op = pWLoop = pF
2bf00 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  rom->aLoop[iLoop
2bf10 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ];.    pLevel->i
2bf20 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69  From = pWLoop->i
2bf30 54 61 62 3b 20 2f 2a 20 46 49 58 4d 45 3a 20 4f  Tab; /* FIXME: O
2bf40 6d 69 74 20 74 68 65 20 69 46 72 6f 6d 20 66 69  mit the iFrom fi
2bf50 65 6c 64 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  eld */.    pLeve
2bf60 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
2bf70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2bf80 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
2bf90 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
2bfa0 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
2bfb0 72 65 64 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  red ){.    pWInf
2bfc0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 57 49 6e  o->nOBSat = pWIn
2bfd0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
2bfe0 78 70 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  xpr;.    pWInfo-
2bff0 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d  >revMask = pFrom
2c000 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 7d 0a 20  ->revLoop;.  }. 
2c010 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2c020 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a   = pFrom->nRow;.
2c030 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f  .  /* Free tempo
2c040 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20  rary memory and 
2c050 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a  return success *
2c060 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
2c070 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
2c080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c090 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  K;.}../*.** Gene
2c0a0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
2c0b0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
2c0c0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
2c0d0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2c0e0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2c0f0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
2c100 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
2c110 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
2c120 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
2c130 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
2c140 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
2c150 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
2c160 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
2c170 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
2c180 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2c190 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
2c1a0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
2c1b0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
2c1c0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
2c1d0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
2c1e0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
2c1f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2c200 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
2c210 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
2c220 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
2c230 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
2c240 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
2c250 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
2c260 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
2c270 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2c280 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
2c290 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2c2a0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
2c2b0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
2c2c0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
2c2d0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2c2e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2c2f0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
2c300 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
2c310 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
2c320 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2c330 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
2c340 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
2c350 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
2c360 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
2c370 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
2c380 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2c390 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
2c3a0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
2c3b0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2c3c0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2c3d0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2c3e0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
2c3f0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
2c400 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
2c410 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
2c420 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
2c430 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
2c440 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c460 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2c470 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2c480 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2c490 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
2c4a0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
2c4b0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4d0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
2c4e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
2c4f0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
2c500 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
2c510 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
2c520 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
2c530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2c540 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
2c550 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
2c560 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
2c570 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
2c580 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
2c590 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
2c5a0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
2c5b0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
2c5c0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
2c5d0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
2c5e0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
2c5f0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
2c600 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
2c610 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
2c620 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
2c630 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
2c640 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
2c650 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
2c660 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
2c670 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
2c680 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
2c690 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
2c6a0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
2c6b0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
2c6c0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
2c6d0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
2c6e0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
2c6f0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
2c700 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
2c710 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
2c720 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
2c730 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
2c740 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
2c750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
2c760 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
2c770 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
2c780 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
2c790 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
2c7a0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
2c7b0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
2c7c0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
2c7d0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
2c7e0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
2c7f0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
2c800 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
2c810 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
2c820 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
2c830 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
2c840 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
2c850 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
2c860 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2c870 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
2c880 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
2c890 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
2c8a0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
2c8b0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
2c8c0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
2c8d0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
2c8e0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
2c8f0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
2c900 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
2c910 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
2c920 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2c930 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
2c940 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
2c950 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
2c960 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
2c970 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
2c980 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
2c990 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
2c9a0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
2c9b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
2c9c0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
2c9d0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
2c9e0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
2c9f0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
2ca00 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
2ca10 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
2ca20 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
2ca30 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
2ca40 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
2ca50 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
2ca60 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
2ca70 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
2ca80 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
2ca90 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
2caa0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
2cab0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2cac0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
2cad0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
2cae0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
2caf0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
2cb00 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
2cb10 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
2cb20 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
2cb30 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
2cb40 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
2cb50 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
2cb60 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
2cb70 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
2cb80 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
2cb90 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
2cba0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
2cbb0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
2cbc0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
2cbd0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
2cbe0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
2cbf0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
2cc00 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
2cc10 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
2cc20 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
2cc30 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
2cc40 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
2cc50 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
2cc60 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
2cc70 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
2cc80 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
2cc90 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
2cca0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
2ccb0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
2ccc0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
2ccd0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
2cce0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
2ccf0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
2cd00 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
2cd10 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
2cd20 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
2cd30 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2cd40 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
2cd50 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
2cd60 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
2cd70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2cd80 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
2cd90 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
2cda0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
2cdb0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
2cdc0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
2cdd0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
2cde0 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
2cdf0 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
2ce00 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
2ce10 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
2ce20 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
2ce30 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
2ce40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2ce50 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
2ce60 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
2ce70 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
2ce80 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74  WhereInfo.nOBSat
2ce90 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2cea0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2ceb0 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e  .  This.** is an
2cec0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68   optimization th
2ced0 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 20 75  at prevents an u
2cee0 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20  nnecessary sort 
2cef0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
2cf00 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64 65 78  t.** if an index
2cf10 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
2cf20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2cf30 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69  ause already exi
2cf40 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sts..**.** If th
2cf50 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c  e where clause l
2cf60 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61  oops cannot be a
2cf70 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69  rranged to provi
2cf80 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  de the correct.*
2cf90 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20  * output order, 
2cfa0 74 68 65 6e 20 57 68 65 72 65 49 6e 66 6f 2e 6e  then WhereInfo.n
2cfb0 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f 0a 57  OBSat is 0..*/.W
2cfc0 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
2cfd0 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
2cfe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2cff0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2d000 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2d010 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2d020 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
2d030 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
2d040 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
2d050 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
2d060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2d070 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2d080 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2d090 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
2d0a0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
2d0b0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
2d0c0 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20  st *pDistinct,  
2d0d0 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69  /* The select-li
2d0e0 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  st for DISTINCT 
2d0f0 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c  queries - or NUL
2d100 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  L */.  u16 wctrl
2d110 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
2d120 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
2d130 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
2d140 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
2d150 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
2d160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2d170 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2d180 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
2d190 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
2d1a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
2d1b0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
2d1c0 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
2d1d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
2d1e0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2d1f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
2d200 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2d210 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
2d220 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
2d230 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
2d240 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
2d250 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
2d260 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
2d270 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
2d280 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
2d290 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2d2a0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
2d2b0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
2d2c0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
2d2d0 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
2d2e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
2d2f0 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
2d300 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
2d310 68 65 72 65 42 65 73 74 49 64 78 20 73 57 42 49  hereBestIdx sWBI
2d320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73  ;         /* Bes
2d330 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 63  t index search c
2d340 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2d350 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
2d360 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
2d370 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
2d380 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2d390 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2d3a0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2d3b0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2d3c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2d3d0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2d3e0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2d3f0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2d400 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2d410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d420 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2d430 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2d440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d450 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d460 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2d490 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
2d4a0 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
2d4b0 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ion */.  memset(
2d4c0 26 73 57 42 49 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWBI, 0, sizeof
2d4d0 28 73 57 42 49 29 29 3b 0a 20 20 73 57 42 49 2e  (sWBI));.  sWBI.
2d4e0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2d4f0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
2d500 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
2d510 29 3b 0a 20 20 73 57 4c 42 2e 70 50 61 72 73 65  );.  sWLB.pParse
2d520 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 4c   = pParse;.  sWL
2d530 42 2e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  B.db = pParse->d
2d540 62 3b 0a 20 20 73 57 4c 42 2e 70 54 61 62 4c 69  b;.  sWLB.pTabLi
2d550 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2d560 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
2d570 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
2d580 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
2d590 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2d5a0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2d5b0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2d5c0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
2d5d0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
2d5e0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
2d5f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
2d600 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
2d610 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
2d620 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2d630 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
2d640 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
2d650 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
2d660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2d670 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
2d680 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
2d690 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
2d6a0 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
2d6b0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
2d6c0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
2d6d0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
2d6e0 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
2d6f0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
2d700 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
2d710 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
2d720 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
2d730 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
2d740 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
2d750 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
2d760 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d770 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
2d780 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
2d790 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
2d7a0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
2d7b0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
2d7c0 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
2d7d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
2d7e0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2d7f0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
2d800 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
2d810 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
2d820 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
2d830 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
2d840 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2d850 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
2d860 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
2d870 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
2d880 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
2d890 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
2d8a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2d8b0 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
2d8c0 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
2d8d0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
2d8e0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
2d8f0 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
2d900 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
2d910 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
2d920 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
2d930 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
2d940 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
2d950 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
2d960 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
2d970 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
2d980 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2d990 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  ;.  nByteWInfo =
2d9a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2d9b0 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2d9c0 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2d9d0 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2d9e0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2d9f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
2da00 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f        nByteWInfo
2da10 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   + .      sizeof
2da20 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a  (WhereClause) +.
2da30 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
2da40 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a  reMaskSet).  );.
2da50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2da60 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
2da70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2da80 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
2da90 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
2daa0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2dab0 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
2dac0 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
2dad0 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
2dae0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2daf0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2db00 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2db10 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2db20 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
2db30 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74  WInfo->pDistinct
2db40 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20   = pDistinct;.  
2db50 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
2db60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2db70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
2db80 66 6f 2d 3e 70 57 43 20 3d 20 73 57 42 49 2e 70  fo->pWC = sWBI.p
2db90 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
2dba0 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
2dbb0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
2dbc0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
2dbd0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
2dbe0 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
2dbf0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
2dc00 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2dc10 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
2dc20 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
2dc30 26 73 57 42 49 2e 70 57 43 5b 31 5d 3b 0a 20 20  &sWBI.pWC[1];.  
2dc40 73 57 42 49 2e 61 4c 65 76 65 6c 20 3d 20 70 57  sWBI.aLevel = pW
2dc50 49 6e 66 6f 2d 3e 61 3b 0a 20 20 73 57 4c 42 2e  Info->a;.  sWLB.
2dc60 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
2dc70 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 70 57  .  sWLB.pWC = pW
2dc80 49 6e 66 6f 2d 3e 70 57 43 3b 0a 0a 20 20 2f 2a  Info->pWC;..  /*
2dc90 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
2dca0 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
2dcb0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
2dcc0 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
2dcd0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
2dce0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
2dcf0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2dd00 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
2dd10 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
2dd20 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2dd30 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2dd40 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74 20  pt) ) pDistinct 
2dd50 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  = 0;..  /* Split
2dd60 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2dd70 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
2dd80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
2dd90 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
2dda0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2ddb0 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
2ddc0 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2ddd0 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
2dde0 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
2ddf0 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 73 57  ereClauseInit(sW
2de00 42 49 2e 70 57 43 2c 20 70 50 61 72 73 65 2c 20  BI.pWC, pParse, 
2de10 70 4d 61 73 6b 53 65 74 2c 20 77 63 74 72 6c 46  pMaskSet, wctrlF
2de20 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2de30 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
2de40 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
2de50 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
2de60 73 57 42 49 2e 70 57 43 2c 20 70 57 68 65 72 65  sWBI.pWC, pWhere
2de70 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20  , TK_AND);   /* 
2de80 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32  IMP: R-15842-532
2de90 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20  96 */.    .  /* 
2dea0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
2deb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2dec0 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
2ded0 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
2dee0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2def0 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
2df00 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
2df10 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
2df20 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
2df30 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  e && (nTabList==
2df40 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
2df50 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
2df60 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
2df70 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2df80 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
2df90 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
2dfa0 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2dfb0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
2dfc0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
2dfd0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2dfe0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2dff0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2e000 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e010 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
2e020 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
2e030 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
2e040 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
2e050 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
2e060 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
2e070 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
2e080 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
2e090 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
2e0a0 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
2e0b0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2e0c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2e0d0 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
2e0e0 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
2e0f0 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
2e100 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2e110 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
2e120 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2e130 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
2e140 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
2e150 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
2e160 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
2e170 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2e180 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
2e190 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
2e1a0 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
2e1b0 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
2e1c0 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
2e1d0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2e1e0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2e1f0 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
2e200 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
2e210 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
2e220 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2e230 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
2e240 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
2e250 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
2e260 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
2e270 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2e280 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2e290 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2e2a0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
2e2b0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
2e2c0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
2e2d0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
2e2e0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
2e2f0 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
2e300 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
2e310 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
2e320 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
2e330 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
2e340 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
2e350 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
2e360 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2e370 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2e380 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
2e390 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2e3a0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2e3b0 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
2e3c0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2e3d0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2e3e0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2e3f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
2e400 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
2e410 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
2e420 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2e430 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2e440 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2e450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2e460 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
2e470 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
2e480 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
2e490 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2e4a0 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2e4b0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2e4c0 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
2e4d0 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
2e4e0 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
2e4f0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
2e500 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2e510 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2e520 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
2e530 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
2e540 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
2e550 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
2e560 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
2e570 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
2e580 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
2e590 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
2e5a0 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
2e5b0 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
2e5c0 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
2e5d0 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 73 57 42  ll(pTabList, sWB
2e5e0 49 2e 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  I.pWC);.  if( db
2e5f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e600 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2e610 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2e620 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2e630 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2e640 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2e650 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2e660 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2e670 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2e680 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2e690 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2e6a0 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2e6b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2e6c0 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2e6d0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2e6e0 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2e6f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2e700 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2e710 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2e720 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2e730 73 57 42 49 2e 70 57 43 2c 20 70 44 69 73 74 69  sWBI.pWC, pDisti
2e740 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73  nct) ){.    pDis
2e750 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70  tinct = 0;.    p
2e760 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e770 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2e780 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
2e790 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
2e7a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2e7b0 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
2e7c0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
2e7d0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
2e7e0 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  ));.  rc = where
2e7f0 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
2e800 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2e810 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2e820 6f 72 3b 0a 0a 20 20 2f 2a 20 44 69 73 70 6c 61  or;..  /* Displa
2e830 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
2e840 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69  reLoop objects i
2e850 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20  f wheretrace is 
2e860 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65  enabled */.#ifde
2e870 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2e880 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2e890 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
2e8a0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
2e8b0 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  ;.    int i = 0;
2e8c0 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
2e8d0 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
2e8e0 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
2e8f0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
2e900 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
2e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e920 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
2e930 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
2e940 59 58 5a 22 3b 0a 20 20 20 20 66 6f 72 28 70 3d  YXZ";.    for(p=
2e950 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
2e960 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
2e970 70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 49 64  p){.      p->cId
2e980 20 3d 20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25   = zLabel[(i++)%
2e990 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
2e9a0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2e9b0 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69 73  Print(p, pTabLis
2e9c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
2e9d0 6e 64 69 66 0a 0a 20 20 77 68 65 72 65 50 61 74  ndif..  wherePat
2e9e0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2e9f0 2d 31 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  -1);.  if( db->m
2ea00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2ea10 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2ea20 6f 72 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or;.  if( pWInfo
2ea30 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
2ea40 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
2ea50 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
2ea60 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20  o->nRowOut);.   
2ea70 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2ea80 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2ea90 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2eaa0 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
2eab0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2eac0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ead0 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
2eae0 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ii;.    sqlite3D
2eaf0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
2eb00 20 53 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   Solution");.   
2eb10 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
2eb20 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Sat ){.      sql
2eb30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2eb40 22 20 4f 52 44 45 52 20 42 59 20 6f 6d 69 74 74  " ORDER BY omitt
2eb50 65 64 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  ed rev=0x%llx\n"
2eb60 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
2eb70 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
2eb80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2eb90 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
2eba0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
2ebb0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
2ebc0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
2ebd0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
2ebe0 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
2ebf0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
2ec00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
2ec10 69 66 20 30 20 20 2f 2a 20 46 49 58 4d 45 3a 20  if 0  /* FIXME: 
2ec20 41 64 64 20 74 68 69 73 20 62 61 63 6b 20 69 6e  Add this back in
2ec30 3f 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 74 68 65  ? */.  /* If the
2ec40 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
2ec50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
2ec60 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
2ec70 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
2ec80 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
2ec90 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
2eca0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
2ecb0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
2ecc0 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
2ecd0 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
2ece0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
2ecf0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2ed00 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
2ed10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
2ed20 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
2ed30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2ed40 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2ed50 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2ed60 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2ed70 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2ed80 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2ed90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2eda0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26  SS_DESIRED)!=0 &
2edb0 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  & (andFlags & WH
2edc0 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29  ERE_UNIQUE)!=0 )
2edd0 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b  {.    pWInfo->ok
2ede0 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20  OnePass = 1;.   
2edf0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c   pWInfo->a[0].pl
2ee00 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  an.wsFlags &= ~W
2ee10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
2ee20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2ee30 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
2ee40 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
2ee50 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
2ee60 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
2ee70 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
2ee80 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2ee90 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2eea0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2eeb0 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
2eec0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
2eed0 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f  ier Goto */.  no
2eee0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
2eef0 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  sk)0;.  pWInfo->
2ef00 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c  nRowOut = (doubl
2ef10 65 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  e)1;.  for(ii=0,
2ef20 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2ef30 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
2ef40 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
2ef50 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2ef60 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
2ef70 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
2ef80 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
2ef90 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
2efa0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2efb0 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
2efc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2efd0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
2efe0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
2eff0 70 4c 6f 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62  pLoop;..    pTab
2f000 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2f010 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2f020 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
2f030 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2f040 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
2f050 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2f060 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2f070 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2f080 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
2f090 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2f0a0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2f0b0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
2f0c0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2f0d0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
2f0e0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
2f0f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f100 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2f110 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2f120 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2f130 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
2f140 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2f150 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
2f160 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
2f170 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
2f180 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
2f190 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
2f1a0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2f1b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f1c0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
2f1d0 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
2f1e0 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
2f1f0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
2f200 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
2f210 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
2f220 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2f230 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2f240 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f250 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
2f260 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2f270 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
2f280 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
2f290 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2f2a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
2f2b0 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
2f2c0 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
2f2d0 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
2f2e0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
2f2f0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2f300 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
2f310 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
2f320 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ase( pTab->nCol=
2f330 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2f340 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e  testcase( pTab->
2f350 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
2f360 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
2f370 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
2f380 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
2f390 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
2f3a0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
2f3b0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
2f3c0 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
2f3d0 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
2f3e0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
2f3f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f400 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
2f410 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f420 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
2f450 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
2f460 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f470 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
2f480 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2f490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2f4a0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2f4b0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2f4c0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2f4d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
2f4e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f4f0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2f500 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  X.    if( (pLoop
2f510 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f520 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30  E_TEMP_INDEX)!=0
2f530 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2f540 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2f550 78 28 70 50 61 72 73 65 2c 20 73 57 42 49 2e 70  x(pParse, sWBI.p
2f560 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
2f570 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2f580 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2f590 66 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  f.    if( pLoop-
2f5a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
2f5b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  =0 ){.      Inde
2f5c0 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
2f5d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2f5e0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2f5f0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
2f600 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
2f610 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a  , pIx);.      /*
2f620 20 46 49 58 4d 45 3a 20 20 4d 69 67 68 74 20 6e   FIXME:  Might n
2f630 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 69 49  eed to be the iI
2f640 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 2e  dxCur parameter.
2f650 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
2f660 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  tion.      ** us
2f670 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  e pTabItem->iCur
2f680 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58  sor if WHERE_IDX
2f690 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69  _ONLY */.      i
2f6a0 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70  nt iIndexCur = p
2f6b0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
2f6c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2f6d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f6e0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
2f6f0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
2f700 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
2f710 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
2f720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f730 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
2f740 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  ad, iIndexCur, p
2f750 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  Ix->tnum, iDb,. 
2f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f770 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2f780 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
2f790 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56  ANDOFF);.      V
2f7a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f7b0 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
2f7c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2f7d0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
2f7e0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
2f7f0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2f800 26 3d 20 7e 67 65 74 4d 61 73 6b 28 73 57 42 49  &= ~getMask(sWBI
2f810 2e 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  .pWC->pMaskSet, 
2f820 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2f830 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  r);.  }.  pWInfo
2f840 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
2f850 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f860 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
2f870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2f880 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2f890 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
2f8a0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
2f8b0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
2f8c0 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
2f8d0 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
2f8e0 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
2f8f0 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
2f900 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
2f910 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
2f920 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
2f930 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2f940 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
2f950 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
2f960 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65  ii++){.    pLeve
2f970 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2f980 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  i];.    explainO
2f990 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
2f9a0 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2f9b0 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72   ii, pLevel->iFr
2f9c0 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b  om, wctrlFlags);
2f9d0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
2f9e0 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
2f9f0 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 77 63 74  (pWInfo, ii, wct
2fa00 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64  rlFlags, notRead
2fa10 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
2fa20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
2fa30 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
2fa40 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f  }..  /* Done. */
2fa50 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2fa60 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2fa70 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2fa80 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2fa90 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2faa0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2fab0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2fac0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2fad0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2fae0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2faf0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2fb00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2fb10 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2fb20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2fb30 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2fb40 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2fb50 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2fb60 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2fb70 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2fb80 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2fb90 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2fba0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2fbb0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2fbc0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2fbd0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2fbe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2fbf0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2fc00 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2fc10 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2fc20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2fc30 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2fc40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2fc50 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2fc60 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2fc70 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2fc80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
2fc90 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2fca0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
2fcb0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
2fcc0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2fcd0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2fce0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2fcf0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2fd00 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
2fd10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2fd20 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2fd30 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
2fd40 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
2fd50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2fd60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
2fd70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
2fd80 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
2fd90 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
2fda0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2fdb0 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
2fdc0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
2fdd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2fde0 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
2fdf0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
2fe00 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
2fe10 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
2fe20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2fe30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2fe40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2fe50 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
2fe60 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
2fe70 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
2fe80 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
2fe90 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
2fea0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
2feb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fec0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
2fed0 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
2fee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fef0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
2ff00 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
2ff10 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
2ff20 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
2ff30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2ff40 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
2ff50 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
2ff60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2ff70 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
2ff80 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
2ff90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2ffa0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ffb0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2ffc0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
2ffd0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2ffe0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
2fff0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
30000 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
30010 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
30020 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
30030 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  Join);.      ass
30040 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
30050 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
30060 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
30070 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e       || (pLoop->
30080 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30090 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
300a0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
300b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
300c0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
300d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
300e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
300f0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
30100 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
30110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30120 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
30130 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
30140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30150 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
30160 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
30170 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
30180 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30190 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
301a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
301b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
301c0 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
301d0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
301e0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
301f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
30200 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30210 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
30220 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
30230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30240 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
30250 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
30260 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
30270 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
30280 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
30290 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
302a0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
302b0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
302c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
302d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
302e0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
302f0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
30300 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
30310 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
30320 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30330 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  in..  */.  asser
30340 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
30350 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  l==1 || pWInfo->
30360 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74  nLevel==pTabList
30370 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
30380 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
30390 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
303a0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
303b0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
303c0 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20  ex *pIdx = 0;.  
303d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
303e0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
303f0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
30400 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
30410 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
30420 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
30430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
30440 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  b!=0 );.    pLoo
30450 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
30460 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
30470 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
30480 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
30490 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
304a0 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
304b0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
304c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
304d0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OPEN_CLOSE)==0.
304e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
304f0 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
30500 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
30510 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
30520 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
30530 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
30540 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30550 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30560 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
30570 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
30580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
30590 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
305a0 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
305b0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
305c0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29 3d 3d 30  _TEMP_INDEX))==0
305d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
305e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
305f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
30600 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
30610 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
30620 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
30630 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
30640 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
30650 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
30660 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
30670 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
30680 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
30690 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
306a0 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
306b0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
306c0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
306d0 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
306e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
306f0 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
30700 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
30710 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
30720 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
30730 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
30740 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
30750 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
30760 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
30770 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
30780 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
30790 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
307a0 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
307b0 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
307c0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
307d0 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
307e0 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
307f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
30800 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
30810 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
30820 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
30830 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
30840 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
30850 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
30860 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
30870 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
30880 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
30890 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
308a0 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
308b0 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
308c0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
308d0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
308e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
308f0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
30900 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
30910 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
30920 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
30930 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
30940 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
30950 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
30960 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
30970 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
30980 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
30990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
309a0 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  pIdx && !db->mal
309b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
309c0 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73     int k, j, las
309d0 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  t;.      VdbeOp 
309e0 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70  *pOp;..      pOp
309f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
30a00 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  tOp(v, pWInfo->i
30a10 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74  Top);.      last
30a20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
30a30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
30a40 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f      for(k=pWInfo
30a50 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20  ->iTop; k<last; 
30a60 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
30a70 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
30a80 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
30a90 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
30aa0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
30ab0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
30ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
30ad0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
30ae0 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
30af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
30b00 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43  p->p2==pIdx->aiC
30b10 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20  olumn[j] ){.    
30b20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
30b30 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  2 = j;.         
30b40 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
30b50 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
30b70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
30b80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
30b90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30ba0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
30bb0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30bc0 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64 78 2d  Y)==0 || j<pIdx-
30bd0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
30be0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
30bf0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
30c00 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
30c10 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
30c20 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30c30 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
30c40 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
30c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30c60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
30c70 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
30c80 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
30c90 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
30ca0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
30cb0 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
30cc0 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
30cd0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.