/ Hex Artifact Content
Login

Artifact 3f4f25df651e8cea5b02d94aeee28838e9c5e2c3:


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 63 6f  ause of table co
08c0: 64 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ded by this loop
08d0: 20 2a 2f 0a 20 20 75 38 20 69 53 6f 72 74 49 64   */.  u8 iSortId
08e0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  x;          /* S
08f0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d  orting index num
0900: 62 65 72 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f  ber.  0==None */
0910: 0a 20 20 75 31 36 20 6e 54 65 72 6d 3b 20 20 20  .  u16 nTerm;   
0920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0930: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
0940: 20 61 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 75 33   aTerm[] */.  u3
0950: 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  2 wsFlags;      
0960: 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66      /* WHERE_* f
0970: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
0980: 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 64 6f  the plan */.  do
0990: 75 62 6c 65 20 72 53 65 74 75 70 3b 20 20 20 20  uble rSetup;    
09a0: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
09b0: 73 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20  setup cost (ex: 
09c0: 63 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74  create transient
09d0: 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 64 6f 75   index) */.  dou
09e0: 62 6c 65 20 72 52 75 6e 3b 20 20 20 20 20 20 20  ble rRun;       
09f0: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75     /* Cost of ru
0a00: 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20  nning each loop 
0a10: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 4f 75 74  */.  double nOut
0a20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73  ;          /* Es
0a30: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0a40: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
0a50: 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73  .  union {.    s
0a60: 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20  truct {         
0a70: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
0a80: 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61  tion for interna
0a90: 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a  l btree tables *
0aa0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b  /.      int nEq;
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61  * Number of equa
0ad0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
0ae0: 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20   */.      Index 
0af0: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
0b00: 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20   /* Index used, 
0b10: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d  or NULL */.    }
0b20: 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75   btree;.    stru
0b30: 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  ct {            
0b40: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
0b50: 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  n for virtual ta
0b60: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  bles */.      in
0b70: 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20  t idxNum;       
0b80: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
0b90: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  mber */.      u8
0ba0: 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20 20   needFree;      
0bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78  sqlite3_free(idx
0bd0: 53 74 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a  Str) is needed *
0be0: 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72 64  /.      u8 isOrd
0bf0: 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  ered;          /
0c00: 2a 20 54 72 75 65 20 69 66 20 73 61 74 69 73 66  * True if satisf
0c10: 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ies ORDER BY */.
0c20: 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61        u16 omitMa
0c30: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
0c40: 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62  Terms that may b
0c50: 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20  e omitted */.   
0c60: 20 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b     char *idxStr;
0c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0c80: 65 78 20 69 64 65 6e 74 69 66 69 65 72 20 73 74  ex identifier st
0c90: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74  ring */.    } vt
0ca0: 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 57 68 65  ab;.  } u;.  Whe
0cb0: 72 65 54 65 72 6d 20 2a 2a 61 54 65 72 6d 3b 20  reTerm **aTerm; 
0cc0: 20 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73     /* WhereTerms
0cd0: 20 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65   used */.  Where
0ce0: 4c 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b  Loop *pNextLoop;
0cf0: 20 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f   /* Next WhereLo
0d00: 6f 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  op object in the
0d10: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a   WhereClause */.
0d20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  };../*.** Each i
0d30: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0d40: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
0d50: 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65  equence of Where
0d60: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20  Loop objects.** 
0d70: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73  that implement s
0d80: 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68  ome or all of th
0d90: 65 20 65 6e 74 69 72 65 20 71 75 65 72 79 20 70  e entire query p
0da0: 6c 61 6e 2e 20 20 0a 2a 2f 0a 73 74 72 75 63 74  lan.  .*/.struct
0db0: 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20 20 42   WherePath {.  B
0dc0: 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70 3b  itmask maskLoop;
0dd0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
0de0: 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  of all WhereLoop
0df0: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 69 73   objects in this
0e00: 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74 6d 61   path */.  Bitma
0e10: 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20 20 20  sk revLoop;     
0e20: 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74 68 61   /* aLoop[]s tha
0e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 76 65  t should be reve
0e40: 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52 20 42  rsed for ORDER B
0e50: 59 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  Y */.  double nR
0e60: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ow;          /* 
0e70: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
0e80: 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72 61 74   of rows generat
0e90: 65 64 20 62 79 20 74 68 69 73 20 70 61 74 68 20  ed by this path 
0ea0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73  */.  double rCos
0eb0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  t;         /* To
0ec0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68 69 73  tal cost of this
0ed0: 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20 69 73   path */.  u8 is
0ee0: 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20  Ordered;        
0ef0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
0f00: 20 70 61 74 68 20 73 61 74 69 73 66 69 65 73 20   path satisfies 
0f10: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 75 38  ORDER BY */.  u8
0f20: 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
0f30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0f40: 68 65 20 69 73 4f 72 64 65 72 65 64 20 66 69 65  he isOrdered fie
0f50: 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ld is valid */. 
0f60: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c 6f   WhereLoop **aLo
0f70: 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61 79 20  op;    /* Array 
0f80: 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
0f90: 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  ects implementin
0fa0: 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a 7d  g this path */.}
0fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65  ;../*.** The que
0fc0: 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65  ry generator use
0fd0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
0fe0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20  stances of this 
0ff0: 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
1000: 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20  help it analyze 
1010: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
1020: 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ns of the WHERE 
1030: 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48  clause.  Each WH
1040: 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75  ERE.** clause su
1050: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1060: 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68  eparated from th
1070: 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20  e others by AND 
1080: 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73  operators,.** us
1090: 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69  ually, or someti
10a0: 6d 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  mes subexpressio
10b0: 6e 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  ns separated by 
10c0: 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68  OR..**.** All Wh
10d0: 65 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c  ereTerms are col
10e0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69  lected into a si
10f0: 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65  ngle WhereClause
1100: 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a   structure.  .**
1110: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
1120: 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a  dentity holds:.*
1130: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72  *.**        Wher
1140: 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65  eTerm.pWC->a[Whe
1150: 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57  reTerm.idx] == W
1160: 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57  hereTerm.**.** W
1170: 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66  hen a term is of
1180: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20                X 
11a0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a  <op> <expr>.**.*
11b0: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63  * where X is a c
11c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c  olumn name and <
11d0: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65  op> is one of ce
11e0: 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c  rtain operators,
11f0: 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65  .** then WhereTe
1200: 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e  rm.leftCursor an
1210: 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65  d WhereTerm.u.le
1220: 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20  ftColumn record 
1230: 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  the.** cursor nu
1240: 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  mber and column 
1250: 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57  number for X.  W
1260: 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74  hereTerm.eOperat
1270: 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  or records.** th
1280: 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62  e <op> using a b
1290: 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20  itmask encoding 
12a0: 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78  defined by WO_xx
12b0: 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a  x below.  The.**
12c0: 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73   use of a bitmas
12d0: 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74  k encoding for t
12e0: 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f  he operator allo
12f0: 77 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a  ws us to search.
1300: 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74  ** quickly for t
1310: 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20  erms that match 
1320: 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64  any of several d
1330: 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f  ifferent operato
1340: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72  rs..**.** A Wher
1350: 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f  eTerm might also
1360: 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   be two or more 
1370: 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  subterms connect
1380: 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20  ed by OR:.**.** 
1390: 20 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f          (t1.X <o
13a0: 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74  p> <expr>) OR (t
13b0: 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29  1.Y <op> <expr>)
13c0: 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49   OR .....**.** I
13d0: 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61  n this second ca
13e0: 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68  se, wtFlag as th
13f0: 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65  e TERM_ORINFO se
1400: 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d  t and eOperator=
1410: 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68  =WO_OR.** and th
1420: 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f  e WhereTerm.u.pO
1430: 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e  rInfo field poin
1440: 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20  ts to auxiliary 
1450: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
1460: 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  .** is collected
1470: 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a   about the.**.**
1480: 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68   If a term in th
1490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  e WHERE clause d
14a0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69  oes not match ei
14b0: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
14c0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65  previous.** cate
14d0: 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70  gories, then eOp
14e0: 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20  erator==0.  The 
14f0: 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20  WhereTerm.pExpr 
1500: 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73  field is still s
1510: 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69  et.** to the ori
1520: 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73  ginal subexpress
1530: 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  ion content and 
1540: 77 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75  wtFlags is set u
1550: 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a  p appropriately.
1560: 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20  ** but no other 
1570: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68  fields in the Wh
1580: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61  ereTerm object a
1590: 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a  re meaningful..*
15a0: 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61  *.** When eOpera
15b0: 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69  tor!=0, prereqRi
15c0: 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c  ght and prereqAl
15d0: 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66  l record sets of
15e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c   cursor numbers,
15f0: 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20  .** but they do 
1600: 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20  so indirectly.  
1610: 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61  A single WhereMa
1620: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20  skSet structure 
1630: 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75  translates.** cu
1640: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  rsor number into
1650: 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72   bits and the tr
1660: 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20  anslated bit is 
1670: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72  stored in the pr
1680: 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20  ereq.** fields. 
1690: 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e   The translation
16a0: 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65   is used in orde
16b0: 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68  r to maximize th
16c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62  e number of.** b
16d0: 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69  its that will fi
16e0: 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20  t in a Bitmask. 
16f0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1700: 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62   numbers might b
1710: 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20  e.** spread out 
1720: 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67  over the non-neg
1730: 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20  ative integers. 
1740: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
1750: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
1760: 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20  ers might be 3, 
1770: 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33  8, 9, 10, 20, 23
1780: 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54  , 41, and 45.  T
1790: 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a  he WhereMaskSet.
17a0: 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68  ** translates th
17b0: 65 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f  ese sparse curso
17c0: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63  r numbers into c
17d0: 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67  onsecutive integ
17e0: 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  ers.** beginning
17f0: 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72   with 0 in order
1800: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73   to make the bes
1810: 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f  t possible use o
1820: 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a  f the available.
1830: 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42  ** bits in the B
1840: 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20  itmask.  So, in 
1850: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1860: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
1870: 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62  mbers.** would b
1880: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e  e mapped into in
1890: 74 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68  tegers 0 through
18a0: 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75   7..**.** The nu
18b0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18c0: 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74   a join is limit
18d0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
18e0: 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70   of bits.** in p
18f0: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
1900: 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64  rereqAll.  The d
1910: 65 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74  efault is 64 bit
1920: 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a  s, hence SQLite.
1930: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20  ** is only able 
1940: 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73  to process joins
1950: 20 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65   with 64 or fewe
1960: 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 72  r tables..*/.str
1970: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
1980: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
19a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
19b0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
19c0: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
19d0: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
19e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
19f0: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
1a00: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
1a10: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
1a20: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1a40: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
1a50: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1a60: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1a70: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1a80: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1a90: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1aa0: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1ab0: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1ac0: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1ad0: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1ae0: 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65  rmation if (eOpe
1af0: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
1b00: 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41 6e  0 */.    WhereAn
1b10: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
1b20: 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d   /* Extra inform
1b30: 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72 61  ation if (eOpera
1b40: 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  tor& WO_AND)!=0 
1b50: 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31 36 20  */.  } u;.  u16 
1b60: 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20  eOperator;      
1b70: 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76      /* A WO_xx v
1b80: 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20  alue describing 
1b90: 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77 74 46  <op> */.  u8 wtF
1ba0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1bb0: 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20 62 69    /* TERM_xxx bi
1bc0: 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65  t flags.  See be
1bd0: 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69  low */.  u8 nChi
1be0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
1bf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
1c00: 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74  ildren that must
1c10: 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20   disable us */. 
1c20: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1c30: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
1c40: 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72 6d  clause this term
1c50: 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20   is part of */. 
1c60: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52   Bitmask prereqR
1c70: 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d  ight;    /* Bitm
1c80: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73  ask of tables us
1c90: 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70 52 69  ed by pExpr->pRi
1ca0: 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ght */.  Bitmask
1cb0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
1cc0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1cd0: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
1ce0: 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d 3b 0a   by pExpr */.};.
1cf0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
1d00: 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54 65  alues of WhereTe
1d10: 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a 23 64  rm.wtFlags.*/.#d
1d20: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
1d30: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
1d40: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
1d50: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1d60: 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23 64 65  b, pExpr) */.#de
1d70: 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55 41  fine TERM_VIRTUA
1d80: 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 41  L    0x02   /* A
1d90: 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  dded by the opti
1da0: 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63  mizer.  Do not c
1db0: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ode */.#define T
1dc0: 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20 30  ERM_CODED      0
1dd0: 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74 65  x04   /* This te
1de0: 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  rm is already co
1df0: 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ded */.#define T
1e00: 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20 30  ERM_COPIED     0
1e10: 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20 63  x08   /* Has a c
1e20: 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hild */.#define 
1e30: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20 20 20  TERM_ORINFO     
1e40: 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64 20 74  0x10   /* Need t
1e50: 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72 65  o free the Where
1e60: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 6f  Term.u.pOrInfo o
1e70: 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69 6e 65  bject */.#define
1e80: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 20 20   TERM_ANDINFO   
1e90: 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65 64 20   0x20   /* Need 
1ea0: 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72  to free the Wher
1eb0: 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e 66 6f  eTerm.u.pAndInfo
1ec0: 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e 65 20   obj */.#define 
1ed0: 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20  TERM_OR_OK      
1ee0: 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64 20 64  0x40   /* Used d
1ef0: 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  uring OR-clause 
1f00: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 69  processing */.#i
1f10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f20: 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65 66 69  LE_STAT3.#  defi
1f30: 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20  ne TERM_VNULL   
1f40: 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75 66   0x80   /* Manuf
1f50: 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20 6f  actured x>NULL o
1f60: 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20 2a  r x<=NULL term *
1f70: 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  /.#else.#  defin
1f80: 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20  e TERM_VNULL    
1f90: 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62 6c  0x00   /* Disabl
1fa0: 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20  ed if not using 
1fb0: 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66 0a  stat3 */.#endif.
1fc0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1fd0: 63 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 53  ce of the WhereS
1fe0: 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73  can object is us
1ff0: 65 64 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f  ed as an iterato
2000: 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a  r for locating.*
2010: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  * terms in the W
2020: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2030: 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74   are useful to t
2040: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
2050: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2060: 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 54  eScan {.  WhereT
2070: 65 72 6d 20 2a 70 43 75 72 72 65 6e 74 3b 20 20  erm *pCurrent;  
2080: 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 72 65 63       /* Most rec
2090: 65 6e 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 57  ent match */.  W
20a0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 69  hereClause *pOri
20b0: 67 57 43 3b 20 20 20 20 20 20 2f 2a 20 4f 72 69  gWC;      /* Ori
20c0: 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74  ginal, innermost
20d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a   WhereClause */.
20e0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
20f0: 57 43 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  WC;          /* 
2100: 57 68 65 72 65 43 6c 61 75 73 65 20 63 75 72 72  WhereClause curr
2110: 65 6e 74 6c 79 20 62 65 69 6e 67 20 73 63 61 6e  ently being scan
2120: 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ned */.  char *z
2130: 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  CollName;       
2140: 20 20 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65      /* Must have
2150: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   this collating 
2160: 73 65 71 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74  sequence, if not
2170: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
2180: 69 64 78 61 66 66 3b 20 20 20 20 20 20 20 20 20  idxaff;         
2190: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61        /* Must ma
21a0: 74 63 68 20 74 68 69 73 20 61 66 66 69 6e 69 74  tch this affinit
21b0: 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21  y, if zCollName!
21c0: 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67  =NULL */.  unsig
21d0: 6e 65 64 20 63 68 61 72 20 6e 45 71 75 69 76 3b  ned char nEquiv;
21e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 45  of entries in aE
2200: 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69  quiv[] */.  unsi
2210: 67 6e 65 64 20 63 68 61 72 20 69 45 71 75 69 76  gned char iEquiv
2220: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
2230: 6e 75 73 65 64 20 73 6c 6f 74 20 69 6e 20 61 45  nused slot in aE
2240: 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20  quiv[] */.  u32 
2250: 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
2260: 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 70 74         /* Accept
2270: 61 62 6c 65 20 6f 70 65 72 61 74 6f 72 73 20 2a  able operators *
2280: 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20  /.  int k;      
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a0: 2a 20 52 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e  * Resume scannin
22b0: 67 20 61 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e  g at this->pWC->
22c0: 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20  a[this->k] */.  
22d0: 69 6e 74 20 61 45 71 75 69 76 5b 32 32 5d 3b 20  int aEquiv[22]; 
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22f0: 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72  rsor,Column pair
2300: 73 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 63  s for equivalenc
2310: 65 20 63 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a  e classes */.};.
2320: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2330: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2340: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f  ing structure ho
2350: 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  lds all informat
2360: 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57  ion about a.** W
2370: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f  HERE clause.  Mo
2380: 73 74 6c 79 20 74 68 69 73 20 69 73 20 61 20 63  stly this is a c
2390: 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65  ontainer for one
23a0: 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65   or more WhereTe
23b0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61  rms..**.** Expla
23c0: 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72  nation of pOuter
23d0: 3a 20 20 46 6f 72 20 61 20 57 48 45 52 45 20 63  :  For a WHERE c
23e0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
23f0: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
2400: 20 20 61 20 41 4e 44 20 28 28 62 20 41 4e 44 20    a AND ((b AND 
2410: 63 29 20 4f 52 20 28 64 20 41 4e 44 20 65 29 29  c) OR (d AND e))
2420: 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65   AND f.**.** The
2430: 72 65 20 61 72 65 20 73 65 70 61 72 61 74 65 20  re are separate 
2440: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
2450: 63 74 73 20 66 6f 72 20 74 68 65 20 77 68 6f 6c  cts for the whol
2460: 65 20 63 6c 61 75 73 65 20 61 6e 64 20 66 6f 72  e clause and for
2470: 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c 61 75 73  .** the subclaus
2480: 65 73 20 22 28 62 20 41 4e 44 20 63 29 22 20 61  es "(b AND c)" a
2490: 6e 64 20 22 28 64 20 41 4e 44 20 65 29 22 2e 20  nd "(d AND e)". 
24a0: 20 54 68 65 20 70 4f 75 74 65 72 20 66 69 65 6c   The pOuter fiel
24b0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 62 63  d of the.** subc
24c0: 6c 61 75 73 65 73 20 70 6f 69 6e 74 73 20 74 6f  lauses points to
24d0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
24e0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
24f0: 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f  whole clause..*/
2500: 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61  .struct WhereCla
2510: 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  use {.  Parse *p
2520: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2530: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2540: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2550: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2560: 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  et;  /* Mapping 
2570: 6f 66 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  of table cursor 
2580: 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61  numbers to bitma
2590: 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  sks */.  WhereCl
25a0: 61 75 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20  ause *pOuter;   
25b0: 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75    /* Outer conju
25c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f  nction */.  u8 o
25d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
25e0: 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70       /* Split op
25f0: 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20  erator.  TK_AND 
2600: 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 75 31  or TK_OR */.  u1
2610: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
2620: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
2630: 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e  include WHERE_AN
2640: 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69 6e 74 20  D_ONLY */.  int 
2650: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
2660: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2670: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
2680: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
2690: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26a0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
26b0: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
26c0: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
26d0: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
26e0: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
26f0: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
2700: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2710: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
2720: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
2730: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
2740: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
2750: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
2760: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
2770: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
2780: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
2790: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
27a0: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
27b0: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
27c0: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
27d0: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
27e0: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
27f0: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
2800: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
2810: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
2820: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2830: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
2840: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
2850: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
2860: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
2870: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
2880: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
2890: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
28a0: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
28b0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
28c0: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
28d0: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
28e0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
28f0: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
2900: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
2910: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
2920: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
2930: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
2940: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
2950: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2960: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
2970: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
2980: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
2990: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
29a0: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
29b0: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
29c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
29d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
29e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
29f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
2a00: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
2a10: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
2a20: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
2a30: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
2a40: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
2a50: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
2a60: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2a70: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
2a80: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
2a90: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
2aa0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
2ab0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
2ac0: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
2ad0: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
2ae0: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
2af0: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
2b00: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
2b10: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
2b20: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
2b30: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
2b40: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
2b50: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
2b60: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
2b70: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
2b80: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
2b90: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
2ba0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
2bb0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
2bc0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
2bd0: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
2be0: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
2bf0: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
2c00: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
2c10: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
2c20: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
2c30: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
2c40: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
2c50: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
2c60: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
2c70: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
2c80: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
2c90: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
2ca0: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
2cb0: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
2cc0: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
2cd0: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
2ce0: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
2cf0: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
2d00: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2d10: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
2d20: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
2d30: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
2d40: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
2d50: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2d60: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
2d70: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
2d80: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
2d90: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
2da0: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
2db0: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
2dc0: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
2dd0: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
2de0: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
2df0: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
2e00: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
2e10: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
2e20: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
2e30: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
2e40: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
2e50: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
2e60: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
2e70: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
2e80: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
2e90: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
2ea0: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
2eb0: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
2ec0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
2ed0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ef0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
2f00: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
2f10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
2f20: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
2f30: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2f40: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
2f50: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
2f60: 2a 20 41 20 57 68 65 72 65 43 6f 73 74 20 6f 62  * A WhereCost ob
2f70: 6a 65 63 74 20 72 65 63 6f 72 64 73 20 61 20 6c  ject records a l
2f80: 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20 61  ookup strategy a
2f90: 6e 64 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  nd the estimated
2fa0: 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70 75 72 73  .** cost of purs
2fb0: 75 69 6e 67 20 74 68 61 74 20 73 74 72 61 74 65  uing that strate
2fc0: 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  gy..*/.struct Wh
2fd0: 65 72 65 43 6f 73 74 20 7b 0a 20 20 57 68 65 72  ereCost {.  Wher
2fe0: 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20 20 20 2f  ePlan plan;    /
2ff0: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 73 74 72  * The lookup str
3000: 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c  ategy */.  doubl
3010: 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  e rCost;      /*
3020: 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74 20 6f 66   Overall cost of
3030: 20 70 75 72 73 75 69 6e 67 20 74 68 69 73 20 73   pursuing this s
3040: 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a  earch strategy *
3050: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64  /.  Bitmask used
3060: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
3070: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65  k of cursors use
3080: 64 20 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a  d by this plan *
3090: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
30a0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 66 61 63   object is a fac
30b0: 74 6f 72 79 20 66 6f 72 20 57 68 65 72 65 4c 6f  tory for WhereLo
30c0: 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
30d0: 20 70 61 72 74 69 63 75 6c 61 72 20 71 75 65 72   particular quer
30e0: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  y..*/.struct Whe
30f0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 7b 0a  reLoopBuilder {.
3100: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
3110: 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo;        /* I
3120: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
3130: 20 74 68 69 73 20 57 48 45 52 45 20 2a 2f 0a 20   this WHERE */. 
3140: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
3150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3160: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3170: 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
3180: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
3190: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
31a0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
31b0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
31c0: 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
31d0: 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 53 72  se terms */.  Sr
31e0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
3200: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
3210: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
3220: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
3230: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
3240: 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
3250: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
3260: 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ate WhereLoop */
3270: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42  .  WhereLoop *pB
3280: 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  est;         /* 
3290: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f  If non-NULL, sto
32a0: 72 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c  re single best l
32b0: 6f 6f 70 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  oop here */.  in
32c0: 74 20 6d 78 54 65 72 6d 3b 20 20 20 20 20 20 20  t mxTerm;       
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
32e0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 54 65  um number of aTe
32f0: 72 6d 5b 5d 20 65 6e 74 72 69 65 73 20 6f 6e 20  rm[] entries on 
3300: 70 4e 65 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  pNew */.};../*.*
3310: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
3320: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
3330: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
3340: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
3350: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
3360: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
3370: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
3380: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
3390: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
33a0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
33b0: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
33c0: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
33d0: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
33e0: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
33f0: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
3400: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
3410: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
3420: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
3430: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
3440: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
3450: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
3460: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
3470: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
3480: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
3490: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
34a0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
34b0: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
34c0: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
34d0: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
34e0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
34f0: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
3500: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
3510: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
3520: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
3530: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
3540: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51  */.#define WO_EQ
3550: 55 49 56 20 20 30 78 34 30 30 20 20 20 20 20 20  UIV  0x400      
3560: 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d 20   /* Of the form 
3570: 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d  A==B, both colum
3580: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ns */.#define WO
3590: 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20 20 20  _NOOP   0x800   
35a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
35b0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74 72 69   does not restri
35c0: 63 74 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ct search space 
35d0: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41  */..#define WO_A
35e0: 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20 20  LL    0xfff     
35f0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
3600: 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76   possible WO_* v
3610: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
3620: 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66   WO_SINGLE 0x0ff
3630: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
3640: 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75  f all non-compou
3650: 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a  nd WO_* values *
3660: 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66  /../*.** Value f
3670: 6f 72 20 77 73 46 6c 61 67 73 20 72 65 74 75 72  or wsFlags retur
3680: 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64 65 78  ned by bestIndex
3690: 28 29 20 61 6e 64 20 73 74 6f 72 65 64 20 69 6e  () and stored in
36a0: 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65 6c 2e 77  .** WhereLevel.w
36b0: 73 46 6c 61 67 73 2e 20 20 54 68 65 73 65 20 66  sFlags.  These f
36c0: 6c 61 67 73 20 64 65 74 65 72 6d 69 6e 65 20 77  lags determine w
36d0: 68 69 63 68 20 73 65 61 72 63 68 0a 2a 2a 20 73  hich search.** s
36e0: 74 72 61 74 65 67 69 65 73 20 61 72 65 20 61 70  trategies are ap
36f0: 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 23 64  propriate..*/.#d
3700: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
3710: 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30 30  D_EQ     0x00000
3720: 30 30 31 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  001  /* rowid=EX
3730: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
3740: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
3750: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
3760: 45 20 20 30 78 30 30 30 30 30 30 30 32 20 20 2f  E  0x00000002  /
3770: 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64  * rowid<EXPR and
3780: 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a  /or rowid>EXPR *
3790: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
37a0: 4e 55 4c 4c 5f 4f 4b 20 20 20 20 20 20 30 78 30  NULL_OK      0x0
37b0: 30 30 30 30 30 30 34 20 20 2f 2a 20 4f 6b 20 74  0000004  /* Ok t
37c0: 6f 20 75 73 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  o use WO_ISNULL 
37d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
37e0: 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78  _IPK          0x
37f0: 30 30 30 30 30 30 30 38 20 20 2f 2a 20 78 20 69  00000008  /* x i
3800: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
3810: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65  IMARY KEY */.#de
3820: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
3830: 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30  N_EQ    0x000000
3840: 31 30 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72  10  /* x=EXPR or
3850: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f 72 20 78   x IN (...) or x
3860: 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66   IS NULL */.#def
3870: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
3880: 5f 52 41 4e 47 45 20 30 78 30 30 30 30 30 30 32  _RANGE 0x0000002
3890: 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64  0  /* x<EXPR and
38a0: 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64  /or x>EXPR */.#d
38b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
38c0: 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 30 30  MN_IN    0x00000
38d0: 30 34 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  040  /* x IN (..
38e0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
38f0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20  ERE_COLUMN_NULL 
3900: 20 30 78 30 30 30 30 30 30 38 30 20 20 2f 2a 20   0x00000080  /* 
3910: 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65  x IS NULL */.#de
3920: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58  fine WHERE_INDEX
3930: 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30 30  ED      0x000000
3940: 66 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20  f0  /* Anything 
3950: 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
3960: 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ex */.#define WH
3970: 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
3980: 20 30 78 30 30 30 32 30 30 66 33 20 20 2f 2a 20   0x000200f3  /* 
3990: 44 6f 65 73 20 6e 6f 74 20 64 6f 20 61 20 66 75  Does not do a fu
39a0: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
39b0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
39c0: 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30  N_ABLE      0x00
39d0: 30 31 30 30 66 31 20 20 2f 2a 20 41 62 6c 65 20  0100f1  /* Able 
39e0: 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e  to support an IN
39f0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65   operator */.#de
3a00: 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c  fine WHERE_TOP_L
3a10: 49 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 31  IMIT    0x000001
3a20: 30 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72  00  /* x<EXPR or
3a30: 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x<=EXPR constra
3a40: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
3a50: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20  HERE_BTM_LIMIT  
3a60: 20 20 30 78 30 30 30 30 30 32 30 30 20 20 2f 2a    0x00000200  /*
3a70: 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58   x>EXPR or x>=EX
3a80: 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  PR constraint */
3a90: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42  .#define WHERE_B
3aa0: 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78 30 30  OTH_LIMIT   0x00
3ab0: 30 30 30 33 30 30 20 20 2f 2a 20 42 6f 74 68 20  000300  /* Both 
3ac0: 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45 58 50  x>EXPR and x<EXP
3ad0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
3ae0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20  RE_IDX_ONLY     
3af0: 30 78 30 30 30 30 30 34 30 30 20 20 2f 2a 20 55  0x00000400  /* U
3b00: 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20  se index only - 
3b10: 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64  omit table */.#d
3b20: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45  efine WHERE_ORDE
3b30: 52 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30  RED      0x00000
3b40: 38 30 30 20 20 2f 2a 20 4f 75 74 70 75 74 20 77  800  /* Output w
3b50: 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63 6f  ill appear in co
3b60: 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23  rrect order */.#
3b70: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45 56  define WHERE_REV
3b80: 45 52 53 45 20 20 20 20 20 20 30 78 30 30 30 30  ERSE      0x0000
3b90: 31 30 30 30 20 20 2f 2a 20 53 63 61 6e 20 69 6e  1000  /* Scan in
3ba0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
3bb0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3bc0: 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78 30  UNIQUE       0x0
3bd0: 30 30 30 32 30 30 30 20 20 2f 2a 20 53 65 6c 65  0002000  /* Sele
3be0: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
3bf0: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66   one row */.#def
3c00: 69 6e 65 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  ine WHERE_ALL_UN
3c10: 49 51 55 45 20 20 20 30 78 30 30 30 30 34 30 30  IQUE   0x0000400
3c20: 30 20 20 2f 2a 20 54 68 69 73 20 61 6e 64 20 61  0  /* This and a
3c30: 6c 6c 20 70 72 69 6f 72 20 68 61 76 65 20 6f 6e  ll prior have on
3c40: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
3c50: 20 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51 55 45   WHERE_OB_UNIQUE
3c60: 20 20 20 20 30 78 30 30 30 30 38 30 30 30 20 20      0x00008000  
3c70: 2f 2a 20 56 61 6c 75 65 73 20 69 6e 20 4f 52 44  /* Values in ORD
3c80: 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 20 61 72  ER BY columns ar
3c90: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
3cc0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
3cd0: 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 23   output row */.#
3ce0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52  define WHERE_VIR
3cf0: 54 55 41 4c 54 41 42 4c 45 20 30 78 30 30 30 31  TUALTABLE 0x0001
3d00: 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72  0000  /* Use vir
3d10: 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65  tual-table proce
3d20: 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65  ssing */.#define
3d30: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
3d40: 20 20 20 20 30 78 30 30 30 32 30 30 30 30 20 20      0x00020000  
3d50: 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74  /* OR using mult
3d60: 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a  iple indices */.
3d70: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45  #define WHERE_TE
3d80: 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30  MP_INDEX   0x000
3d90: 34 30 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61  40000  /* Uses a
3da0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
3db0: 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  x */.#define WHE
3dc0: 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20 20 20  RE_DISTINCT     
3dd0: 30 78 30 30 30 38 30 30 30 30 20 20 2f 2a 20 43  0x00080000  /* C
3de0: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66 6f 72  orrect order for
3df0: 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23 64 65   DISTINCT */.#de
3e00: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56 45 52  fine WHERE_COVER
3e10: 5f 53 43 41 4e 20 20 20 30 78 30 30 31 30 30 30  _SCAN   0x001000
3e20: 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e  00  /* Full scan
3e30: 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69   of a covering i
3e40: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
3e50: 57 48 45 52 45 5f 53 49 4e 47 4c 45 5f 52 4f 57  WHERE_SINGLE_ROW
3e60: 20 20 20 30 78 30 30 32 30 30 30 30 30 20 20 2f     0x00200000  /
3e70: 2a 20 4e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  * No more than o
3e80: 6e 65 20 72 6f 77 20 67 75 61 72 61 6e 74 65 65  ne row guarantee
3e90: 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d */../*.** This
3ea0: 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
3eb0: 20 6d 61 6e 79 20 73 65 70 61 72 61 74 65 20 73   many separate s
3ec0: 75 62 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  ubroutines that 
3ed0: 77 6f 72 6b 20 74 6f 67 65 74 68 65 72 20 74 6f  work together to
3ee0: 0a 2a 2a 20 66 69 6e 64 20 74 68 65 20 62 65 73  .** find the bes
3ef0: 74 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  t indices to use
3f00: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61   for accessing a
3f10: 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
3f20: 65 20 69 6e 20 61 20 71 75 65 72 79 2e 0a 2a 2a  e in a query..**
3f30: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
3f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3f50: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 63 6f  ructure holds co
3f60: 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntext informatio
3f70: 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69  n about the.** i
3f80: 6e 64 65 78 20 73 65 61 72 63 68 20 73 6f 20 74  ndex search so t
3f90: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 6d 6f  hat it can be mo
3fa0: 72 65 20 65 61 73 69 6c 79 20 70 61 73 73 65 64  re easily passed
3fb0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61 72   between the var
3fc0: 69 6f 75 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  ious.** routines
3fd0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
3fe0: 75 63 74 20 57 68 65 72 65 42 65 73 74 49 64 78  uct WhereBestIdx
3ff0: 20 57 68 65 72 65 42 65 73 74 49 64 78 3b 0a 73   WhereBestIdx;.s
4000: 74 72 75 63 74 20 57 68 65 72 65 42 65 73 74 49  truct WhereBestI
4010: 64 78 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  dx {.  Parse *pP
4020: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
4030: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4040: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
4050: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4070: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
4080: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
4090: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
40a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
40b0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
40c0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
40d0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40f0: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
4100: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
4110: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56  /.  Bitmask notV
4120: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4130: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
4140: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
4150: 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
4160: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4170: 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
4180: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
4190: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
41a0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
41b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
41c0: 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   The select-list
41d0: 20 69 66 20 71 75 65 72 79 20 69 73 20 44 49 53   if query is DIS
41e0: 54 49 4e 43 54 20 2a 2f 0a 20 20 73 71 6c 69 74  TINCT */.  sqlit
41f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
4200: 70 70 49 64 78 49 6e 66 6f 3b 20 2f 2a 20 49 6e  ppIdxInfo; /* In
4210: 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  dex information 
4220: 70 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49  passed to xBestI
4230: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ndex */.  int i,
4240: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
4260: 63 68 20 6c 6f 6f 70 20 69 73 20 62 65 69 6e 67  ch loop is being
4270: 20 63 6f 64 65 64 3b 20 23 20 6f 66 20 6c 6f 6f   coded; # of loo
4280: 70 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ps */.  WhereLev
4290: 65 6c 20 2a 61 4c 65 76 65 6c 3b 20 20 20 20 20  el *aLevel;     
42a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
42b0: 61 62 6f 75 74 20 6f 75 74 65 72 20 6c 6f 6f 70  about outer loop
42c0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
42d0: 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
42e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
42f0: 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
4300: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   */.};../*.** Re
4310: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4320: 20 70 72 6f 62 65 20 63 6f 73 74 20 69 73 20 6c   probe cost is l
4330: 65 73 73 20 74 68 61 6e 20 74 68 65 20 62 61 73  ess than the bas
4340: 65 6c 69 6e 65 20 63 6f 73 74 0a 2a 2f 0a 73 74  eline cost.*/.st
4350: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 61 72 65  atic int compare
4360: 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65  Cost(const Where
4370: 43 6f 73 74 20 2a 70 50 72 6f 62 65 2c 20 63 6f  Cost *pProbe, co
4380: 6e 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70  nst WhereCost *p
4390: 42 61 73 65 6c 69 6e 65 29 7b 0a 20 20 69 66 28  Baseline){.  if(
43a0: 20 70 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3c 70   pProbe->rCost<p
43b0: 42 61 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74 20  Baseline->rCost 
43c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
43d0: 28 20 70 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3e  ( pProbe->rCost>
43e0: 70 42 61 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74  pBaseline->rCost
43f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4400: 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61 6e 2e  f( pProbe->plan.
4410: 6e 4f 42 53 61 74 3e 70 42 61 73 65 6c 69 6e 65  nOBSat>pBaseline
4420: 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 20  ->plan.nOBSat ) 
4430: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
4440: 70 50 72 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 52 6f  pProbe->plan.nRo
4450: 77 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61  w<pBaseline->pla
4460: 6e 2e 6e 52 6f 77 20 29 20 72 65 74 75 72 6e 20  n.nRow ) return 
4470: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
4480: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
4490: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
44a0: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
44b0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
44c0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
44d0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
44e0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
44f0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
4500: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
4510: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61  tialized */.  Pa
4520: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4530: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
4540: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
4550: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
4560: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d  *pMaskSet,  /* M
4570: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c  apping from tabl
4580: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
4590: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
45a0: 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
45c0: 67 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52  ght include WHER
45d0: 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b  E_AND_ONLY */.){
45e0: 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d  .  pWC->pParse =
45f0: 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e   pParse;.  pWC->
4600: 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b  pMaskSet = pMask
4610: 53 65 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  Set;.  pWC->pOut
4620: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
4630: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
4640: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
4650: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
4660: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
4670: 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43  ->aStatic;.  pWC
4680: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
4690: 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a  ctrlFlags;.}../*
46a0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
46b0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
46c0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
46d0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
46e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
46f0: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
4700: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
4710: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
4720: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4730: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
4740: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
4750: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
4760: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
4770: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
4780: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4790: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
47a0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
47b0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
47c0: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
47d0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
47e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
47f0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
4800: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
4810: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
4820: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
4830: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
4840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4850: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
4860: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
4870: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
4880: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
4890: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
48a0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
48b0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
48c0: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
48d0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
48e0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
48f0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
4900: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
4910: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
4920: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
4930: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4940: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
4950: 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  b;.  for(i=pWC->
4960: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
4970: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
4980: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77  +){.    if( a->w
4990: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
49a0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
49b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
49c0: 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a  (db, a->pExpr);.
49d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d      }.    if( a-
49e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
49f0: 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  ORINFO ){.      
4a00: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
4a10: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e  e(db, a->u.pOrIn
4a20: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
4a30: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
4a40: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a  TERM_ANDINFO ){.
4a50: 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e        whereAndIn
4a60: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
4a70: 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20  u.pAndInfo);.   
4a80: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43   }.  }.  if( pWC
4a90: 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  ->a!=pWC->aStati
4aa0: 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
4ab0: 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e  DbFree(db, pWC->
4ac0: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
4ad0: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
4ae0: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
4af0: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
4b00: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
4b10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
4b20: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
4b30: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
4b40: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
4b50: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
4b60: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
4b70: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
4b80: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
4b90: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
4ba0: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
4bb0: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
4bc0: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
4bd0: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
4be0: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
4bf0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
4c00: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
4c10: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
4c20: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
4c30: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
4c40: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
4c50: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
4c60: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
4c70: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
4c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
4c90: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
4ca0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
4cb0: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
4cc0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
4cd0: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
4ce0: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
4cf0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
4d00: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
4d10: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
4d20: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
4d30: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
4d40: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
4d50: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
4d60: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
4d70: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
4d80: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
4d90: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
4da0: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
4db0: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
4dc0: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
4dd0: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
4de0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
4df0: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
4e00: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
4e10: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
4e20: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
4e30: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
4e40: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
4e50: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
4e60: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
4e70: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
4e80: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
4e90: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
4ea0: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
4eb0: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
4ec0: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
4ed0: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
4ee0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
4ef0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
4f00: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
4f10: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
4f20: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31  ;  /* EV: R-0021
4f30: 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28  1-15100 */.  if(
4f40: 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43   pWC->nTerm>=pWC
4f50: 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57  ->nSlot ){.    W
4f60: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d  hereTerm *pOld =
4f70: 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c   pWC->a;.    sql
4f80: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
4f90: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
4fa0: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
4fb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
4fc0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
4fd0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
4fe0: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
4ff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
5000: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
5010: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
5020: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5030: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
5040: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
5050: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
5060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5070: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
5080: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
5090: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
50a0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
50b0: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
50c0: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
50d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
50e0: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
50f0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
5100: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
5110: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
5120: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
5130: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
5140: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
5150: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
5160: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
5170: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
5180: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
5190: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
51a0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
51b0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
51c0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
51d0: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
51e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
51f0: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
5200: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
5210: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
5220: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
5230: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
5240: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
5250: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
5260: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
5270: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
5280: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
5290: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
52a0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
52b0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
52c0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
52d0: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
52e0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
52f0: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
5300: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
5310: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
5320: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
5330: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
5340: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
5350: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
5360: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
5370: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
5380: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
5390: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
53a0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
53b0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
53c0: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
53d0: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
53e0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
53f0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
5400: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
5410: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
5420: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
5430: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
5440: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
5450: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
5460: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
5470: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
5480: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
5490: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
54a0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
54b0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
54c0: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
54d0: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
54e0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
54f0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
5500: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
5510: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
5520: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
5530: 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e  int op){.  pWC->
5540: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69  op = (u8)op;.  i
5550: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
5560: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
5570: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
5580: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
5590: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
55a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
55b0: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
55c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
55d0: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
55e0: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
55f0: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
5600: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
5610: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
5620: 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68 65   mask set (a Whe
5630: 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74  reMaskSet object
5640: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69  ).*/.#define ini
5650: 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d  tMaskSet(P)  mem
5660: 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66  set(P, 0, sizeof
5670: 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  (*P))../*.** Ret
5680: 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20  urn the bitmask 
5690: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
56a0: 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65  rsor number.  Re
56b0: 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75  turn 0 if.** iCu
56c0: 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74  rsor is not in t
56d0: 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  he set..*/.stati
56e0: 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73  c Bitmask getMas
56f0: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
5700: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
5710: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b  ursor){.  int i;
5720: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
5730: 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a  Set->n<=(int)siz
5740: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5760: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
5770: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
5780: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
5790: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
57a0: 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  rn ((Bitmask)1)<
57b0: 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  <i;.    }.  }.  
57c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
57d0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
57e0: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
57f0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
5800: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
5810: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
5820: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
5830: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
5840: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
5850: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
5860: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
5870: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
5880: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
5890: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
58a0: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
58b0: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
58c0: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
58d0: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
58e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
58f0: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
5900: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
5910: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
5920: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
5930: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
5940: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
5950: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
5960: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
5970: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
5980: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5990: 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73  ne walks (recurs
59a0: 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73  ively) an expres
59b0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65  sion tree and ge
59c0: 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74  nerates.** a bit
59d0: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
59e0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
59f0: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
5a00: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
5a10: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
5a20: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
5a30: 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63  e to work, the c
5a40: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
5a50: 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65  must have.** pre
5a60: 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20  viously invoked 
5a70: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
5a80: 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65  prNames() on the
5a90: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65   expression.  Se
5aa0: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  e.** the header 
5ab0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
5ac0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
5ad0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
5ae0: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  on..** The sqlit
5af0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
5b00: 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f  es() routines lo
5b10: 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  oks for column n
5b20: 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73  ames and.** sets
5b30: 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74   their opcodes t
5b40: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
5b50: 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c  their Expr.iTabl
5b60: 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74  e fields to.** t
5b70: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
5b80: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62  umber of the tab
5b90: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
5ba0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a  e just has to.**
5bb0: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
5bc0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
5bd0: 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  to bitmask value
5be0: 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20  s and OR all.** 
5bf0: 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67  the bitmasks tog
5c00: 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ether..*/.static
5c10: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
5c20: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
5c30: 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c  eMaskSet*, ExprL
5c40: 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ist*);.static Bi
5c50: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
5c60: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
5c70: 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74  MaskSet*, Select
5c80: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
5c90: 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  sk exprTableUsag
5ca0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
5cb0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a  pMaskSet, Expr *
5cc0: 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  p){.  Bitmask ma
5cd0: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  sk = 0;.  if( p=
5ce0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5cf0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
5d00: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73  OLUMN ){.    mas
5d10: 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  k = getMask(pMas
5d20: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
5d30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73  ;.    return mas
5d40: 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20  k;.  }.  mask = 
5d50: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
5d60: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67  MaskSet, p->pRig
5d70: 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ht);.  mask |= e
5d80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5d90: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74  askSet, p->pLeft
5da0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5db0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5dc0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5dd0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
5de0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
5df0: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65  askSet, p->x.pSe
5e00: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lect);.  }else{.
5e10: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
5e20: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
5e30: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c  MaskSet, p->x.pL
5e40: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ist);.  }.  retu
5e50: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
5e60: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
5e70: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
5e80: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
5e90: 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Set, ExprList *p
5ea0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
5eb0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
5ec0: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
5ed0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
5ee0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
5ef0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  i++){.      mask
5f00: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
5f10: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
5f20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
5f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5f40: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
5f50: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
5f60: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
5f70: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
5f80: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
5f90: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
5fa0: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ask = 0;.  while
5fb0: 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c  ( pS ){.    SrcL
5fc0: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e  ist *pSrc = pS->
5fd0: 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pSrc;.    mask |
5fe0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
5ff0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
6000: 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  S->pEList);.    
6010: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
6020: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
6030: 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  Set, pS->pGroupB
6040: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
6050: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
6060: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
6070: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
6080: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
6090: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
60a0: 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   pS->pWhere);.  
60b0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
60c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
60d0: 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b  t, pS->pHaving);
60e0: 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
60f0: 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20  pSrc!=0) ){.    
6100: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
6110: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
6120: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
6130: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
6140: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
6150: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d  (pMaskSet, pSrc-
6160: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
6170: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20          mask |= 
6180: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
6190: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
61a0: 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  [i].pOn);.      
61b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d  }.    }.    pS =
61c0: 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d   pS->pPrior;.  }
61d0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
61e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
61f0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
6200: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
6210: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
6220: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
6230: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
6240: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
6250: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
6260: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
6270: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
6280: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
6290: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a  ", and "IN"..**.
62a0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
62b0: 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36  N-OF: R-59926-26
62c0: 33 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65  393 To be usable
62d0: 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74   by an index a t
62e0: 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f  erm must be.** o
62f0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
6300: 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f  lowing forms: co
6310: 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f  lumn = expressio
6320: 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65  n column > expre
6330: 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ssion.** column 
6340: 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  >= expression co
6350: 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f  lumn < expressio
6360: 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72  n column <= expr
6370: 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73  ession.** expres
6380: 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78  sion = column ex
6390: 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d  pression > colum
63a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20  n expression >= 
63b0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73  column.** expres
63c0: 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78  sion < column ex
63d0: 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75  pression <= colu
63e0: 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20  mn column IN.** 
63f0: 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74  (expression-list
6400: 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62  ) column IN (sub
6410: 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53  query) column IS
6420: 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20   NULL.*/.static 
6430: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
6440: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
6450: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
6460: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
6470: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
6480: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
6490: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
64a0: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
64b0: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
64c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
64d0: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
64e0: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
64f0: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
6500: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
6510: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
6520: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
6530: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
6540: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
6550: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
6560: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
6570: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
6580: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
6590: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
65a0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
65b0: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
65c0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
65d0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
65e0: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
65f0: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
6600: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
6610: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
6620: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
6630: 67 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65  g.** side of the
6640: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20   comparison, it 
6650: 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74  remains associat
6660: 65 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ed with the same
6670: 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74   side after.** t
6680: 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20  he commutation. 
6690: 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  So "Y collate NO
66a0: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
66b0: 65 73 20 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e  es .** "X op Y".
66c0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
66d0: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
66e0: 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68  equence on.** th
66f0: 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65  e left hand side
6700: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
6710: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63   overrides any c
6720: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6730: 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74  e .** attached t
6740: 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72  o the right. For
6750: 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e   the same reason
6760: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
6770: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
6780: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
6790: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
67a0: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
67b0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
67c0: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
67d0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
67e0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
67f0: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
6800: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
6810: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
6820: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73  _Collate);.  ass
6830: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
6840: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
6850: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
6860: 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74 3d  .  if( expRight=
6870: 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  =expLeft ){.    
6880: 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64 20  /* Either X and 
6890: 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c  Y both have COLL
68a0: 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  ATE operator or 
68b0: 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20  neither do */.  
68c0: 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20 29    if( expRight )
68d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20  {.      /* Both 
68e0: 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c  X and Y have COL
68f0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20  LATE operators. 
6900: 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73 20   Make sure X is 
6910: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20  always.      ** 
6920: 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67  used by clearing
6930: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
6940: 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a  flag from Y. */.
6950: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
6960: 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45  ght->flags &= ~E
6970: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
6980: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
6990: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
69a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
69b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
69c0: 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59   Neither X nor Y
69d0: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
69e0: 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68  erators, but X h
69f0: 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
6a00: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  .      ** collat
6a10: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53  ing sequence.  S
6a20: 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c  o add the EP_Col
6a30: 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58  late marker on X
6a40: 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20   to cause.      
6a50: 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61 72  ** it to be sear
6a60: 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20  ched first. */. 
6a70: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
6a80: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
6a90: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  ollate;.    }.  
6aa0: 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  }.  SWAP(Expr*,p
6ab0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
6ac0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
6ad0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
6ae0: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
6af0: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
6b00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
6b10: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
6b20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
6b30: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
6b40: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
6b50: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
6b60: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
6b70: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
6b80: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
6b90: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
6ba0: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
6bb0: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
6bc0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
6bd0: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
6be0: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
6bf0: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
6c00: 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  u16 operatorMask
6c10: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20  (int op){.  u16 
6c20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
6c30: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
6c40: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
6c50: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
6c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
6c70: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
6c80: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
6c90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6ca0: 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70  ert( (WO_EQ<<(op
6cb0: 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66  -TK_EQ)) < 0x7ff
6cc0: 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31  f );.    c = (u1
6cd0: 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  6)(WO_EQ<<(op-TK
6ce0: 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  _EQ));.  }.  ass
6cf0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55  ert( op!=TK_ISNU
6d00: 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55  LL || c==WO_ISNU
6d10: 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
6d20: 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d  op!=TK_IN || c==
6d30: 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72  WO_IN );.  asser
6d40: 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  t( op!=TK_EQ || 
6d50: 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73  c==WO_EQ );.  as
6d60: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20  sert( op!=TK_LT 
6d70: 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  || c==WO_LT );. 
6d80: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
6d90: 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29  LE || c==WO_LE )
6da0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
6db0: 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GT || c==WO_G
6dc0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
6dd0: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57  p!=TK_GE || c==W
6de0: 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  O_GE );.  return
6df0: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   c;.}../*.** Adv
6e00: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
6e10: 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20   WhereTerm that 
6e20: 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e  matches accordin
6e30: 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69  g to the criteri
6e40: 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64  a.** established
6e50: 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20   when the pScan 
6e60: 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69  object was initi
6e70: 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53  alized by whereS
6e80: 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65  canInit()..** Re
6e90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
6ea0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d  re are no more m
6eb0: 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72  atching WhereTer
6ec0: 6d 73 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  ms..*/.WhereTerm
6ed0: 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28   *whereScanNext(
6ee0: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
6ef0: 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  ){.  int iCur;  
6f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6f10: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c   cursor on the L
6f20: 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  HS of the term *
6f30: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
6f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6f50: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48  column on the LH
6f60: 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20  S of the term.  
6f70: 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20  -1 for IPK */.  
6f80: 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
6f90: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
6fa0: 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74  ssion being test
6fb0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
6fc0: 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
6fd0: 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53  Shorthand for pS
6fe0: 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68  can->pWC */.  Wh
6ff0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
7000: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62     /* The term b
7010: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 0a  eing tested */..
7020: 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e    while( pScan->
7030: 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e  iEquiv<=pScan->n
7040: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75  Equiv ){.    iCu
7050: 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  r = pScan->aEqui
7060: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
7070: 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  2];.    iColumn 
7080: 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  = pScan->aEquiv[
7090: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
70a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57  ;.    while( (pW
70b0: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21  C = pScan->pWC)!
70c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
70d0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 70 53 63  pTerm=pWC->a+pSc
70e0: 61 6e 2d 3e 6b 3b 20 70 53 63 61 6e 2d 3e 6b 3c  an->k; pScan->k<
70f0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 53 63 61  pWC->nTerm; pSca
7100: 6e 2d 3e 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n->k++, pTerm++)
7110: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
7120: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
7130: 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d 2d 3e  =iCur && pTerm->
7140: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
7150: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
7160: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7170: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
7180: 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20  UIV)!=0.        
7190: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71     && pScan->nEq
71a0: 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53  uiv<ArraySize(pS
71b0: 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20  can->aEquiv).   
71c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
71d0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
71e0: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 73 71           pX = sq
71f0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
7200: 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  late(pTerm->pExp
7210: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
7220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7230: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
7240: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  N );.           
7250: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61   for(j=0; j<pSca
7260: 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29  n->nEquiv; j+=2)
7270: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7280: 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  if( pScan->aEqui
7290: 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65  v[j]==pX->iTable
72a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72b0: 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  && pScan->aEquiv
72c0: 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75  [j+1]==pX->iColu
72d0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
72e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
7300: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7310: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
7320: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b  pScan->nEquiv ){
7330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7340: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20  Scan->aEquiv[j] 
7350: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
7360: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
7370: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d  n->aEquiv[j+1] =
7380: 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20   pX->iColumn;.  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
73a0: 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a  n->nEquiv += 2;.
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
73c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
73d0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
73e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63 61  eOperator & pSca
73f0: 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b  n->opMask)!=0 ){
7400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
7410: 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69 6e  Verify the affin
7420: 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ity and collatin
7430: 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68  g sequence match
7440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7450: 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  if( pScan->zColl
7460: 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e  Name && (pTerm->
7470: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7480: 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  SNULL)==0 ){.   
7490: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
74a0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
74b0: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
74c0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
74d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
74e0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
74f0: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
7500: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
7510: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
7520: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
7530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7540: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
7550: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
7560: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
7570: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
7580: 65 43 6f 6c 6c 53 65 71 28 70 57 43 2d 3e 70 50  eCollSeq(pWC->pP
7590: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
75d0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
75f0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
7600: 6c 6c 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  ll = pWC->pParse
7610: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
7620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7630: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7640: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
7650: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
7660: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7670: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
7690: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
76a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
76b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
76c0: 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20 20 20   WO_EQ)!=0.     
76d0: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d          && (pX =
76e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
76f0: 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43  Right)->op==TK_C
7700: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
7710: 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65     && pX->iTable
7720: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
7730: 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0].             
7740: 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  && pX->iColumn==
7750: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d  pScan->aEquiv[1]
7760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
77a0: 20 20 70 53 63 61 6e 2d 3e 70 43 75 72 72 65 6e    pScan->pCurren
77b0: 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  t = pTerm;.     
77c0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 2b         pScan->k+
77d0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  +;.            r
77e0: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
77f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7800: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7810: 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57   pWC = pScan->pW
7820: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e  C = pScan->pWC->
7830: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 70 53  pOuter;.      pS
7840: 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 20 20  can->k = 0;.    
7850: 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43  }.    pScan->pWC
7860: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
7870: 43 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20  C;.    pScan->k 
7880: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
7890: 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d  iEquiv += 2;.  }
78a0: 0a 20 20 70 53 63 61 6e 2d 3e 70 43 75 72 72 65  .  pScan->pCurre
78b0: 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nt = 0;.  return
78c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
78d0: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
78e0: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
78f0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
7900: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
7910: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
7920: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
7930: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
7940: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
7950: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
7960: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
7970: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
7980: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
7990: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
79a0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
79b0: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
79c0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
79d0: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
79e0: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
79f0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
7a00: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
7a10: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
7a20: 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74  *.** If X is not
7a30: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
7a40: 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20  MARY KEY then X 
7a50: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  must be compatib
7a60: 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  le with.** index
7a70: 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65 72 65 54   pIdx..*/.WhereT
7a80: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
7a90: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
7aa0: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
7ab0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
7ac0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
7ad0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
7ae0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
7af0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
7b00: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
7b10: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
7b20: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
7b30: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
7b40: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
7b50: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
7b60: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
7b70: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
7b80: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
7b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
7ba0: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
7bb0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
7bc0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
7bd0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
7be0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
7bf0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
7c00: 69 6e 74 20 6a 3b 0a 0a 20 20 6d 65 6d 73 65 74  int j;..  memset
7c10: 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  (pScan, 0, sizeo
7c20: 66 28 2a 70 53 63 61 6e 29 29 3b 0a 20 20 70 53  f(*pScan));.  pS
7c30: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
7c40: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
7c50: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
7c60: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
7c70: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
7c80: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
7c90: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
7ca0: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
7cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
7cc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
7cd0: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
7ce0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d     if( NEVER(j>=
7cf0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
7d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
7d10: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
7d20: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
7d30: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 70  Coll[j];.  }.  p
7d40: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
7d50: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
7d60: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
7d70: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
7d80: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
7d90: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
7da0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
7db0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
7dc0: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
7dd0: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
7de0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
7df0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
7e00: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
7e10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
7e20: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
7e30: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
7e40: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
7e50: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
7e60: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
7e70: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
7e80: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
7e90: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
7ea0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
7eb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
7ec0: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
7ed0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
7ee0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
7ef0: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
7f00: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
7f10: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
7f20: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
7f30: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
7f40: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
7f50: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
7f60: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
7f70: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
7f80: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
7f90: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
7fa0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
7fb0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
7fc0: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
7fd0: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
7fe0: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
7ff0: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
8000: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
8010: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
8020: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
8030: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
8040: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
8050: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
8060: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
8070: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
8080: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
8090: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
80a0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
80b0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
80c0: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
80d0: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
80e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
80f0: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
8100: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
8110: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
8120: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
8130: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
8140: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
8150: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
8160: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
8170: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
8180: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
8190: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
81a0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
81b0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
81c0: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
81d0: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
81e0: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
81f0: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
8200: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
8210: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
8220: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
8230: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
8240: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
8250: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
8260: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
8270: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
8280: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
8290: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
82a0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
82b0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
82c0: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
82d0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
82e0: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
82f0: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
8300: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
8310: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
8320: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
8330: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
8340: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
8350: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
8360: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
8370: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
8380: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
8390: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
83a0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
83b0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
83c0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
83d0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
83e0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
83f0: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
8400: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
8410: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
8420: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
8430: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
8440: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
8450: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
8460: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
8470: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
8480: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
8490: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
84a0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
84b0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
84c0: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
84d0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
84e0: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
84f0: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
8500: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
8510: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
8520: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
8530: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
8540: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
8550: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
8560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
8570: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
8580: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
8590: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
85a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
85b0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
85c0: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
85d0: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
85e0: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
85f0: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
8600: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8610: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
8620: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
8630: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
8640: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
8650: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
8660: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
8670: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
8680: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
8690: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
86a0: 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .  .**.**.*/.sta
86b0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
86c0: 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69  lyzeAll(.  SrcLi
86d0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
86e0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
86f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
8700: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
8710: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
8720: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
8730: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
8740: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
8750: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
8760: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
8770: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
8780: 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a  t, pWC, i);.  }.
8790: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
87a0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
87b0: 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43  MIZATION./*.** C
87c0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
87d0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
87e0: 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72  ion is a LIKE or
87f0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74   GLOB operator t
8800: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70  hat.** can be op
8810: 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e  timized using in
8820: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
8830: 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52  ints.  Return TR
8840: 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73  UE if it is.** s
8850: 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  o and false if n
8860: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ot..**.** In ord
8870: 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  er for the opera
8880: 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69  tor to be optimi
8890: 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d  zible, the RHS m
88a0: 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a  ust be a string.
88b0: 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ** literal that 
88c0: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
88d0: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20  ith a wildcard. 
88e0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
88f0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20  isLikeOrGlob(.  
8900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8910: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
8920: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
8930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8940: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
8950: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
8960: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  ression */.  Exp
8970: 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f  r **ppPrefix,  /
8980: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f  * Pointer to TK_
8990: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
89a0: 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70  n with pattern p
89b0: 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  refix */.  int *
89c0: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
89d0: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
89e0: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
89f0: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
8a00: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
8a10: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
8a20: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
8a30: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
8a40: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
8a50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
8a60: 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  z = 0;         /
8a70: 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20  * String on RHS 
8a80: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
8a90: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
8aa0: 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ht, *pLeft;     
8ab0: 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65   /* Right and le
8ac0: 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20  ft size of LIKE 
8ad0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
8ae0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
8af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
8b00: 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   of operands to 
8b10: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
8b20: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  r */.  int c;   
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74    /* One charact
8b50: 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69  er in z[] */.  i
8b60: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
8b90: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
8ba0: 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20  cters */.  char 
8bb0: 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  wc[3];          
8bc0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8bd0: 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  d characters */.
8be0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8bf0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
8c00: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8c10: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
8c20: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
8c30: 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  ;.  int op;     
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c50: 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67  * Opcode of pRig
8c60: 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71  ht */..  if( !sq
8c70: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
8c80: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
8c90: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
8ca0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8cb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8cc0: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
8cd0: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
8ce0: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
8cf0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
8d00: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  ;.  pLeft = pLis
8d10: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
8d20: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
8d30: 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c  TK_COLUMN .   ||
8d40: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8d50: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
8d60: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20  ITE_AFF_TEXT .  
8d70: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c   || IsVirtual(pL
8d80: 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a  eft->pTab).  ){.
8d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
8da0: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
8db0: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
8dc0: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
8dd0: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
8de0: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
8df0: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
8e00: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
8e10: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
8e20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8e30: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
8e40: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
8e50: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
8e60: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
8e70: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
8e80: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
8e90: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
8ea0: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
8eb0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
8ec0: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
8ed0: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
8ee0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
8ef0: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
8f00: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
8f10: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
8f20: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
8f30: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
8f40: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
8f50: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
8f60: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
8f70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8f80: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
8f90: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
8fa0: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
8fb0: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
8fc0: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
8fd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8fe0: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
8ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
9000: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
9010: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20  pVdbe, iCol);.  
9020: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
9030: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
9040: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
9050: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
9060: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
9070: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
9080: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
9090: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
90a0: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
90b0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
90c0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
90d0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
90e0: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
90f0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
9100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
9110: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
9120: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
9130: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
9140: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
9150: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
9160: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
9170: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
9180: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
9190: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
91a0: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
91b0: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
91c0: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
91d0: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
91e0: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
91f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
9200: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
9210: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9220: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
9230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
9240: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
9250: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
9260: 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c     if( *pisCompl
9270: 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75  ete && pRight->u
9280: 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20  .zToken[1] ){.  
9290: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
92a0: 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b  e rhs of the LIK
92b0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  E expression is 
92c0: 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20  a variable, and 
92d0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
92e0: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
92f0: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d  f the variable m
9300: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
9310: 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   need to invoke 
9320: 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20  the LIKE.       
9330: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20     ** function, 
9340: 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61  then no OP_Varia
9350: 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65  ble will be adde
9360: 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  d to the program
9370: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
9380: 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c  his causes probl
9390: 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ems for the sqli
93a0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
93b0: 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20  er_name().      
93c0: 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77      ** API. To w
93d0: 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20  orkaround them, 
93e0: 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56  add a dummy OP_V
93f0: 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20  ariable here..  
9400: 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
9410: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
9420: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
9430: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
9440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9450: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
9460: 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20  , pRight, r1);. 
9470: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9480: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
9490: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
94a0: 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b  ntAddr(v)-1, 0);
94b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94c0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
94d0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
94e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
94f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9500: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
9510: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
9520: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
9530: 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a  eturn (z!=0);.}.
9540: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9550: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
9560: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
9570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9580: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
9590: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
95a0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
95b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
95c0: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
95d0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
95e0: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
95f0: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
9600: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
9610: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
9620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
9630: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
9640: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
9650: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
9660: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
9670: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9680: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
9690: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
96a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
96b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
96c0: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
96d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63  ->u.zToken,"matc
96e0: 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  h")!=0 ){.    re
96f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
9700: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
9710: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
9720: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
9730: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9740: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
9750: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
9760: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
9770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9780: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
9790: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
97a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
97b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
97c0: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
97d0: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
97e0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
97f0: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
9800: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
9810: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
9820: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
9830: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
9840: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
9850: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9860: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
9870: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
9880: 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73   pDerived->flags
9890: 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73   |= pBase->flags
98a0: 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a   & EP_FromJoin;.
98b0: 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67    pDerived->iRig
98c0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42  htJoinTable = pB
98d0: 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ase->iRightJoinT
98e0: 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  able;.}..#if !de
98f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9900: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
9910: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
9920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9930: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
9940: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
9950: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
9960: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
9970: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
9980: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
9990: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
99a0: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
99b0: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
99c0: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
99f0: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
9a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
9a10: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
9a20: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
9a30: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
9a40: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
9a50: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
9a60: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
9a70: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
9a80: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
9a90: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
9aa0: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
9ab0: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
9ac0: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
9ad0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
9ae0: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
9af0: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
9b00: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
9b10: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
9b20: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
9b30: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
9b40: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
9b50: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
9b60: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
9b70: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
9b80: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
9b90: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
9ba0: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
9bb0: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
9bc0: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
9bd0: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
9be0: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
9bf0: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
9c00: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
9c10: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
9c20: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
9c30: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
9c40: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
9c50: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
9c60: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
9c70: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
9c80: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
9c90: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
9ca0: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
9cb0: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
9cc0: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
9cd0: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
9ce0: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
9cf0: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
9d00: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
9d10: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
9d20: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
9d30: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
9d40: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
9d50: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
9d60: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
9d70: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
9d80: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
9d90: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
9da0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
9db0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
9dc0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9dd0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
9de0: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
9df0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
9e00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
9e10: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
9e20: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
9e30: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
9e40: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
9e50: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
9e60: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
9e70: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
9e80: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
9e90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
9ea0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
9eb0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
9ec0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
9ed0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
9ee0: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
9ef0: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
9f00: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
9f10: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
9f20: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
9f30: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
9f40: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
9f50: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
9f60: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
9f70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
9f80: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
9f90: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
9fa0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
9fb0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
9fc0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
9fd0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
9fe0: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
9ff0: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
a000: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
a010: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
a020: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
a030: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
a040: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
a050: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
a060: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
a070: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
a080: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
a090: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
a0a0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
a0b0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
a0c0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
a0d0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
a0e0: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
a0f0: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
a100: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
a110: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
a120: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
a130: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
a140: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
a150: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
a160: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
a170: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
a180: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
a190: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
a1a0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
a1b0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
a1c0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
a1d0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
a1e0: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
a1f0: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
a200: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
a210: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
a220: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
a230: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
a240: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
a250: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
a260: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
a270: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
a280: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
a290: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
a2a0: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
a2b0: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
a2c0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
a2d0: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
a2e0: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
a2f0: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
a300: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
a310: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
a320: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
a330: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
a340: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
a350: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
a360: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
a370: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
a380: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
a390: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
a3a0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
a3b0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
a3c0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
a3d0: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
a3e0: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
a3f0: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
a400: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
a410: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
a420: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
a430: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
a440: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
a450: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
a460: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
a470: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
a480: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
a490: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
a4a0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
a4b0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
a4c0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
a4d0: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
a4e0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
a4f0: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
a500: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
a510: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
a520: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
a530: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
a540: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
a550: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
a560: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
a570: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
a580: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a590: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
a5a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
a5b0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
a5c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
a5d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
a5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a5f0: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
a600: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
a610: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
a620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
a630: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
a640: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
a650: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
a660: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a680: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
a690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a6a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
a6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
a6c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a6d0: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
a6e0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
a6f0: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
a700: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
a710: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
a720: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
a730: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
a740: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
a750: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
a760: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
a770: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
a780: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
a790: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
a7a0: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a7e0: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
a7f0: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
a800: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
a810: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
a820: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
a830: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
a840: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
a850: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
a860: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
a870: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
a880: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
a890: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
a8a0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
a8b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
a8c0: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
a8d0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
a8e0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
a8f0: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
a900: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
a910: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
a920: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
a930: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
a940: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
a950: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
a960: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
a970: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
a980: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
a990: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
a9a0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
a9b0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
a9c0: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
a9d0: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
a9e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
a9f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
aa00: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
aa10: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
aa20: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
aa30: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
aa40: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
aa50: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
aa60: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
aa70: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
aa80: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
aa90: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
aaa0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
aab0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
aac0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
aad0: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
aae0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
aaf0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
ab00: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
ab10: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
ab20: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
ab30: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
ab40: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
ab50: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
ab60: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
ab70: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
ab80: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
ab90: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
aba0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
abb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
abc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
abd0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
abe0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
abf0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
ac00: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
ac10: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
ac20: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
ac30: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
ac40: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
ac50: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
ac60: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
ac70: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
ac80: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
ac90: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
aca0: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
acb0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
acc0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
acd0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
ace0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
acf0: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
ad00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ad10: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
ad20: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
ad30: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
ad40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
ad50: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
ad60: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
ad70: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
ad80: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
ad90: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
ada0: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
adb0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
adc0: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
add0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
ade0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
adf0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
ae00: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
ae10: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
ae20: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
ae30: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
ae40: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
ae50: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
ae60: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
ae70: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
ae80: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
ae90: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
aea0: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
aeb0: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
aec0: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
aed0: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
aee0: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
aef0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
af00: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
af10: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
af20: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
af30: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
af40: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
af50: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
af60: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
af70: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
af80: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
af90: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
afa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
afb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
afc0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
afd0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
afe0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
aff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
b000: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
b010: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
b020: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
b030: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
b040: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
b050: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
b060: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
b070: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
b080: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
b090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
b0b0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
b0c0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
b0d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
b0e0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
b0f0: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
b100: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
b110: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
b120: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
b130: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
b140: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
b150: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
b160: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
b170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
b180: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
b190: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
b1a0: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
b1b0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
b1c0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
b1d0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
b1e0: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
b1f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
b200: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
b210: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
b220: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
b230: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
b240: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
b250: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
b260: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
b270: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
b280: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
b290: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
b2a0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
b2b0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
b2c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
b2d0: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
b2e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b2f0: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
b300: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
b310: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
b320: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
b330: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
b340: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
b350: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
b360: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
b370: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
b380: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
b390: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
b3a0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
b3b0: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
b3c0: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
b3d0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
b3e0: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
b3f0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
b400: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
b410: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
b420: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
b430: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
b440: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
b450: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
b460: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
b470: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
b480: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
b490: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
b4a0: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
b4b0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
b4c0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
b4d0: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
b4e0: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
b4f0: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
b500: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
b510: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
b520: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
b530: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
b540: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
b550: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
b560: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
b570: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
b580: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
b590: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
b5a0: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
b5b0: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
b5c0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
b5d0: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
b5e0: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
b5f0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
b600: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
b610: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
b620: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
b630: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
b640: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
b650: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
b660: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
b670: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
b680: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
b690: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
b6a0: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
b6b0: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
b6c0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
b6d0: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
b6e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
b6f0: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
b700: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
b710: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
b720: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
b730: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
b740: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
b750: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
b760: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
b770: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
b780: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
b790: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
b7a0: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
b7b0: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
b7c0: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
b7d0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
b7e0: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
b7f0: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
b800: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
b810: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
b820: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
b830: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
b840: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
b850: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
b860: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
b870: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
b880: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
b890: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
b8a0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
b8b0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
b8c0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
b8d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
b8e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b8f0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
b900: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
b910: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
b920: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
b930: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
b940: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
b950: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
b960: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
b970: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
b980: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
b990: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
b9a0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
b9b0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
b9c0: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
b9d0: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
b9e0: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
b9f0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
ba00: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
ba10: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
ba20: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
ba30: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
ba40: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
ba50: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
ba60: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
ba70: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
ba80: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
ba90: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
baa0: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
bab0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
bac0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
bad0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
bae0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
baf0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
bb00: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
bb10: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
bb20: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
bb30: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
bb40: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
bb50: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
bb60: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
bb70: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
bb80: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
bb90: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
bba0: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
bbb0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
bbc0: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
bbd0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
bbe0: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
bbf0: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
bc00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
bc10: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
bc20: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
bc30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc40: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
bc50: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
bc60: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
bc70: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
bc80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
bc90: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
bca0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
bcb0: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
bcc0: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
bcd0: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
bce0: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
bcf0: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
bd00: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
bd10: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
bd20: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
bd30: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
bd40: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
bd50: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
bd60: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
bd70: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
bd80: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
bd90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
bda0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
bdb0: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
bdc0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
bdd0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
bde0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
bdf0: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
be00: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
be10: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
be20: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
be30: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
be40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
be50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
be60: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
be70: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
be80: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
be90: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
bea0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
beb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bec0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
bed0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
bee0: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
bef0: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
bf00: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
bf10: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
bf20: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
bf30: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
bf40: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
bf50: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bf60: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63  ( IsPowerOfTwo(c
bf70: 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20  hngToIN) );.    
bf80: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67      assert( chng
bf90: 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d  ToIN==getMask(pM
bfa0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
bfb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
bfc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
bfd0: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
bfe0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
bff0: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
c000: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
c010: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
c020: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
c030: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
c040: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
c050: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
c060: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
c070: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
c080: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
c090: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
c0a0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
c0b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
c0c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c0d0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
c0e0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
c0f0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
c100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
c110: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
c120: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
c130: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
c140: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
c150: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
c160: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
c170: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
c180: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
c190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
c1a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
c1b0: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
c1c0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
c1d0: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
c1e0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
c1f0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
c200: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
c210: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
c220: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
c230: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
c240: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
c250: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
c260: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
c270: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
c280: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
c290: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
c2a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
c2b0: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
c2c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
c2d0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
c2e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
c2f0: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
c300: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
c310: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
c320: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
c330: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
c340: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
c350: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
c360: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
c370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c390: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
c3a0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
c3b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
c3c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c3d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c3e0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
c3f0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
c400: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
c410: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
c420: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
c430: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
c440: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
c450: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
c460: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
c470: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
c480: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
c490: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
c4a0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
c4b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
c4c0: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
c4d0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
c4f0: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
c500: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
c510: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
c520: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
c530: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
c540: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
c550: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
c560: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
c570: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
c580: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
c590: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
c5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c5b0: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
c5c0: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
c5d0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
c5e0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
c5f0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
c600: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
c610: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
c620: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
c630: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
c640: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c650: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
c660: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
c670: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
c680: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
c690: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
c6a0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
c6b0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
c6c0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
c6d0: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
c6e0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
c6f0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
c700: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
c710: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
c720: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c730: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c740: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
c750: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
c760: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
c770: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
c780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c790: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
c7a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
c7b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c7c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
c7d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
c7e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
c7f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
c800: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
c810: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
c820: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
c830: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
c840: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
c850: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
c860: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
c870: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
c880: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
c890: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
c8a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
c8b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
c8c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
c8d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
c8e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
c8f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
c900: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c910: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
c920: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
c930: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
c940: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
c950: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
c960: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
c970: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
c980: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
c990: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
c9a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
c9b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c9c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c9d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
c9e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
c9f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
ca00: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
ca10: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
ca20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
ca30: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
ca40: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
ca50: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
ca60: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
ca70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
ca80: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
ca90: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
caa0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
cab0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
cac0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
cad0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
cae0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
caf0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
cb00: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
cb10: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
cb20: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
cb30: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
cb40: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
cb50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
cb60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
cb70: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
cb80: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
cb90: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
cba0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
cbb0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
cbc0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
cbd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
cbe0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
cbf0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
cc00: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
cc10: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
cc20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
cc30: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
cc40: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
cc50: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
cc60: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
cc70: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
cc80: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
cc90: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
cca0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
ccb0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
ccc0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
ccd0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
cce0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
ccf0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
cd00: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
cd10: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
cd20: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
cd30: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
cd40: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
cd50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
cd60: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
cd70: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
cd80: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
cd90: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
cda0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
cdb0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
cdc0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
cdd0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
cde0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
cdf0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
ce00: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
ce10: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
ce20: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
ce30: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
ce40: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
ce50: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
ce60: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
ce70: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
ce80: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
ce90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
cea0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
ceb0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
cec0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
cef0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
cf00: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
cf10: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
cf20: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
cf30: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
cf40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
cf70: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
cf80: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
cf90: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
cfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
cfb0: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
cfc0: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
cfd0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
cfe0: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
cff0: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
d000: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
d010: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
d020: 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20  aRight = 0;     
d030: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65       /* Extra de
d040: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45  pendencies on LE
d050: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70  FT JOIN */.  Exp
d060: 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20  r *pStr1 = 0;   
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d080: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
d090: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
d0a0: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  int isComplete =
d0b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d0c0: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
d0d0: 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77  GLOB ends with w
d0e0: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74  ildcard */.  int
d0f0: 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20   noCase = 0;    
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d110: 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69   LIKE/GLOB disti
d120: 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f  nguishes case */
d130: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
d160: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
d170: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
d180: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
d190: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
d1a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d1b0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
d1c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
d1d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
d1e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
d1f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d200: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
d210: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
d220: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
d230: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
d240: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
d250: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
d260: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
d270: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
d280: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
d290: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
d2a0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
d2b0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
d2c0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
d2d0: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
d2e0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
d2f0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
d300: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d310: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
d320: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
d330: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d340: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
d350: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
d360: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
d370: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
d380: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
d390: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
d3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
d3b0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
d3c0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
d3d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
d3e0: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
d3f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d400: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
d410: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
d420: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
d430: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
d440: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
d450: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
d460: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
d470: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
d480: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
d490: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
d4a0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
d4b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
d4c0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
d4d0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
d4e0: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
d4f0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
d500: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
d510: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
d520: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
d530: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
d540: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
d550: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
d560: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
d590: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
d5a0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
d5b0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
d5c0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
d5d0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
d5e0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
d5f0: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
d600: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
d610: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d620: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
d630: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
d640: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
d650: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
d660: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
d670: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
d680: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
d690: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
d6a0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
d6b0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
d6c0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
d6d0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
d6e0: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
d6f0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
d700: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
d710: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
d720: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d730: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
d740: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
d750: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
d760: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
d770: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
d780: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
d790: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
d7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d7b0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
d7c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d7d0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
d7e0: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
d7f0: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
d800: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
d810: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
d820: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
d830: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
d840: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
d850: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
d860: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
d870: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
d880: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
d890: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
d8a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
d8b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d8c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d8d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d8e0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
d8f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
d910: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
d920: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
d930: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
d940: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
d950: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
d960: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
d970: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
d980: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
d990: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
d9a0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
d9b0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
d9c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d9d0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
d9e0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
d9f0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
da00: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
da10: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
da20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
da30: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
da40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
da50: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
da60: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
da70: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
da80: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
da90: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
daa0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
dab0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
dac0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
dad0: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
dae0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
daf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
db00: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
db10: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
db20: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
db30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
db40: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
db50: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
db60: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
db70: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
db80: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
db90: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
dba0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
dbb0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
dbc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
dbd0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
dbe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
dbf0: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
dc00: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
dc10: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
dc20: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
dc30: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
dc40: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
dc50: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
dc60: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
dc70: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
dc80: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
dc90: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
dca0: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
dcb0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
dcc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dcd0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
dce0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
dcf0: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
dd00: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
dd10: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
dd20: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
dd30: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
dd40: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
dd50: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
dd60: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
dd70: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
dd80: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
dd90: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
dda0: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
ddb0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
ddc0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
ddd0: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
dde0: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
ddf0: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
de00: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
de10: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
de20: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
de30: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
de40: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
de50: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
de60: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
de70: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
de80: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
de90: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
dea0: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
deb0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
dec0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
ded0: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
dee0: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
def0: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
df00: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
df10: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
df20: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
df30: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
df40: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
df50: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
df60: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
df70: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
df80: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
df90: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
dfa0: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
dfb0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
dfc0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
dfd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
dfe0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
dff0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
e000: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
e010: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
e020: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
e030: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
e040: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
e050: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
e060: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
e070: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
e0a0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
e0b0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e0e0: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
e0f0: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
e100: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
e110: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
e120: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
e130: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
e140: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
e150: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e160: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
e170: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
e180: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
e190: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
e1a0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e1b0: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
e1c0: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
e1d0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
e1e0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e1f0: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
e200: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e210: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
e220: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
e230: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e240: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
e250: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
e260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
e270: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
e280: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
e290: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
e2a0: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
e2b0: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
e2c0: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
e2d0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
e2e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
e2f0: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
e300: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
e310: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
e320: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
e330: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
e340: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
e350: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
e360: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
e380: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
e390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e3a0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
e3b0: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
e3c0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
e3d0: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
e3e0: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
e3f0: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
e400: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
e410: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
e420: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
e430: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
e440: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
e450: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
e460: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
e470: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
e480: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
e490: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
e4a0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
e4b0: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
e4c0: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
e4d0: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
e4e0: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
e4f0: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
e500: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
e510: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
e520: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
e530: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
e540: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
e550: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
e560: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
e570: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
e580: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
e590: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
e5a0: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
e5b0: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
e5c0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
e5d0: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
e5e0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
e5f0: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
e600: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
e610: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
e620: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
e630: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
e640: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
e650: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e660: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
e670: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
e680: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
e690: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
e6a0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
e6b0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
e6c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e6d0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
e6e0: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
e6f0: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
e700: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
e710: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
e720: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
e730: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
e740: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
e750: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
e760: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
e770: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
e780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
e790: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
e7a0: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
e7b0: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
e7c0: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
e7d0: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
e7e0: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
e7f0: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
e800: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
e810: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
e820: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
e830: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
e840: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
e850: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
e860: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
e870: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
e880: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
e890: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
e8a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
e8b0: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
e8c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
e8d0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
e8e0: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
e8f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e900: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
e910: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
e920: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
e930: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
e940: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
e950: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
e960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
e970: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
e980: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
e990: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
e9a0: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
e9b0: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
e9c0: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
e9d0: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
e9e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
e9f0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
ea00: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
ea10: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
ea20: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
ea30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
ea40: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
ea50: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
ea60: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
ea70: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
ea80: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
ea90: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
eaa0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
eab0: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
eac0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ead0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
eae0: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
eaf0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
eb00: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
eb10: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
eb20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
eb30: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
eb40: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
eb50: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
eb60: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
eb80: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
eb90: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
eba0: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
ebb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
ebc0: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
ebd0: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
ebe0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
ebf0: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
ec00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ec10: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
ec20: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
ec30: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
ec40: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
ec50: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
ec60: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ec70: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
ec80: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
ec90: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
eca0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ecb0: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
ecc0: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
ecd0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
ece0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ecf0: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
ed00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ed10: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
ed20: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
ed30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ed40: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
ed50: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
ed60: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
ed70: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
ed80: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
ed90: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
eda0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
edb0: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
edc0: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
edd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
ede0: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
edf0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
ee00: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
ee10: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
ee20: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
ee30: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
ee40: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
ee50: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
ee60: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
ee70: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
ee80: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
ee90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
eea0: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
eeb0: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
eec0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
eed0: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
eee0: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
eef0: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
ef00: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
ef10: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
ef20: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
ef30: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ef40: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
ef50: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
ef60: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ef70: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
ef80: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
ef90: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
efa0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
efb0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
efc0: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
efd0: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
efe0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
eff0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
f000: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
f010: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
f020: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
f050: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
f060: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
f070: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
f080: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
f090: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
f0a0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
f0b0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
f0c0: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
f0d0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
f0e0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
f0f0: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
f100: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
f110: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
f120: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
f130: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
f140: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
f150: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
f160: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
f170: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
f180: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
f190: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
f1a0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
f1b0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
f1c0: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
f1d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f1e0: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
f1f0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
f200: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
f210: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
f220: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
f230: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
f240: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
f250: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
f260: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
f270: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
f280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f290: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
f2a0: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
f2b0: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
f2c0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
f2d0: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
f2e0: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
f2f0: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
f300: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
f310: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
f320: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
f330: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
f340: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
f350: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
f360: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
f370: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
f380: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
f390: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
f3a0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
f3b0: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
f3c0: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
f3d0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
f3e0: 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
f3f0: 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
f400: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
f410: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
f420: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
f430: 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
f440: 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
f450: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
f460: 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
f470: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
f480: 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
f490: 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
f4a0: 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
f4b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
f4c0: 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
f4d0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
f4e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
f4f0: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
f500: 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
f510: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
f520: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
f530: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
f540: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
f550: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
f560: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
f570: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
f580: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
f590: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f5c0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
f5d0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
f600: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
f610: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
f620: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
f630: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
f640: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
f670: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
f680: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
f690: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
f6a0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
f6b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
f6c0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
f6d0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
f6e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
f6f0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
f700: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f710: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
f720: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
f730: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
f740: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
f750: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
f760: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
f770: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
f780: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
f790: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
f7a0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
f7b0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
f7c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
f7d0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
f7e0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
f7f0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
f800: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
f810: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
f820: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
f830: 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
f840: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
f850: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
f860: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
f870: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
f880: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
f890: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
f8a0: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
f8b0: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
f8c0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
f8d0: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
f8e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f8f0: 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
f900: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
f910: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
f920: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
f930: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65  .** for an expre
f940: 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b  ssion of type TK
f950: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66  _COLUMN that ref
f960: 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ers to the same 
f970: 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73  column and.** us
f980: 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
f990: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
f9a0: 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  s the iCol'th co
f9b0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
f9c0: 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  dx..** Argument 
f9d0: 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72  iBase is the cur
f9e0: 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20  sor number used 
f9f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
fa00: 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a  at pIdx refers.*
fa10: 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  * to..**.** If s
fa20: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
fa30: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
fa40: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
fa50: 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
fa60: 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
fa70: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
fa80: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
fa90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
faa0: 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
fab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fad0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
fae0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
faf0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
fb00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
fb10: 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
fb20: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
fb50: 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
fb60: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
fb70: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
fba0: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
fbb0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
fbe0: 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
fbf0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
fc00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
fc10: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
fc20: 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
fc30: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
fc40: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
fc50: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
fc60: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
fc70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
fc80: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
fc90: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
fca0: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
fcb0: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
fcc0: 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
fcd0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
fce0: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
fcf0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
fd00: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
fd10: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
fd20: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
fd30: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
fd40: 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
fd50: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
fd60: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
fd70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fd80: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
fd90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
fda0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
fdb0: 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69   routine determi
fdc0: 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  nes if pIdx can 
fdd0: 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73  be used to assis
fde0: 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  t in processing 
fdf0: 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75  a.** DISTINCT qu
fe00: 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65  alifier. In othe
fe10: 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74  r words, it test
fe20: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
fe30: 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69   using this.** i
fe40: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74  ndex for the out
fe50: 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65  er loop guarante
fe60: 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74  es that rows wit
fe70: 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66  h equal values f
fe80: 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73  or.** all expres
fe90: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69  sions in the pDi
fea0: 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20  stinct list are 
feb0: 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65  delivered groupe
fec0: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
fed0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
fee0: 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20  he query .**.** 
fef0: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
ff00: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
ff10: 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a  bl WHERE a = ?.*
ff20: 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74  *.** can benefit
ff30: 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20   from any index 
ff40: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61  on columns "b" a
ff50: 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69  nd "c"..*/.stati
ff60: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
ff70: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
ff80: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ff90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ffa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ffb0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ffc0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
ffd0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
ffe0: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
fff0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
10000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10010 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
10020 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  sidered */.  int
10030 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10050 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
10060 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78  r the table pIdx
10070 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72   is on */.  Expr
10080 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
10090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
100a0 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
100b0 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
100c0 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20   nEqCol         
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100e0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
100f0 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
10100 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
10110 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  mask = 0;       
10120 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10130 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66  of unaccounted f
10140 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70  or pDistinct exp
10150 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rs */.  int i;  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
10180 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
10190 0a 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74  .  assert( pDist
101a0 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  inct!=0 );.  if(
101b0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20   pIdx->zName==0 
101c0 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45  || pDistinct->nE
101d0 78 70 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72  xpr>=BMS ) retur
101e0 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
101f0 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
10200 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f  r==BMS-1 );..  /
10210 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
10220 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
10230 6e 73 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e  ns in the distin
10240 63 74 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20  ct list. If any 
10250 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65  of them.  ** are
10260 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75   not simple colu
10270 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72  mn references, r
10280 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68  eturn early. Oth
10290 65 72 77 69 73 65 2c 20 74 65 73 74 20 69 66 20  erwise, test if 
102a0 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63  the.  ** WHERE c
102b0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
102c0 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e   "col=X" clause.
102d0 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
102e0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
102f0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
10300 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
10310 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
10320 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
10330 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
10340 20 74 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20   table as index 
10350 70 49 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72  pIdx, return ear
10360 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  ly. Finally, if 
10370 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a  there is no.  **
10380 20 6d 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58   matching "col=X
10390 22 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  " expression and
103a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f   the column is o
103b0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
103c0 20 61 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73   as pIdx,.  ** s
103d0 65 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  et the correspon
103e0 64 69 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69  ding bit in vari
103f0 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  able mask..  */.
10400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
10410 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
10420 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
10430 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45  rm *pTerm;.    E
10440 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
10450 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
10460 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
10470 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
10480 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
10490 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
104a0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
104b0 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
104c0 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
104d0 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
104e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
104f0 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
10500 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
10510 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
10520 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
10530 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
10540 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
10550 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
10560 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
10570 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
10580 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10590 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
105a0 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
105b0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
105c0 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
105d0 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
105e0 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
105f0 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
10600 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
10610 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
10620 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
10630 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
10640 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
10650 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
10660 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
10670 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
10680 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
10690 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
106a0 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
106b0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
106c0 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
106d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
106e0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
106f0 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
10700 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
10710 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
10720 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
10730 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
10740 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
10750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
10760 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
10770 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
10780 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
10790 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
107a0 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
107b0 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
107c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
107d0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
107e0 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
107f0 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
10800 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
10810 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
10820 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
10830 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
10840 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
10850 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
10880 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
10890 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
108a0 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
108b0 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
108c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
108d0 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
108e0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
108f0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
10900 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
10910 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
10920 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
10930 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
10940 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
10950 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
10960 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
10970 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
10980 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
10990 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
109a0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
109b0 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
109c0 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
109d0 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
109e0 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
109f0 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
10a00 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
10a10 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
10a20 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
10a30 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
10a40 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
10a50 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
10a60 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
10a70 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
10a80 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10a90 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
10aa0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
10ab0 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
10ac0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
10ad0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
10ae0 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
10af0 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
10b00 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
10b10 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
10b20 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
10b30 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
10b40 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
10b50 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
10b60 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
10b70 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
10b80 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
10b90 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
10ba0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
10bb0 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
10bc0 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
10bd0 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
10be0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
10bf0 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
10c00 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
10c10 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
10c20 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
10c30 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
10c40 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
10c50 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
10c60 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
10c70 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
10c80 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
10c90 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
10ca0 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
10cb0 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
10cc0 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
10cd0 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
10ce0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
10cf0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
10d00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
10d10 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
10d20 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
10d30 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
10d40 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
10d50 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
10d60 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
10d70 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
10d80 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
10d90 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
10da0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
10db0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
10dc0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
10dd0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
10de0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
10df0 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
10e00 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
10e10 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
10e20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
10e30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
10e40 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
10e50 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
10e60 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
10e70 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
10e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
10e90 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
10ea0 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
10eb0 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
10ec0 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
10ed0 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
10ee0 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   || pTab->aCol[p
10ef0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
10f00 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
10f10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10f30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10f40 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
10f50 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
10f60 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
10f70 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
10f80 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
10f90 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
10fa0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10fb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10fc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
10fd0 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
10fe0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
10ff0 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
11000 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
11010 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
11020 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
11030 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
11040 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
11050 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
11060 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
11070 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
11080 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
11090 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
110a0 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
110b0 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
110c0 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
110d0 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
110e0 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
110f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
11100 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
11110 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
11120 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
11130 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
11140 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
11150 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
11160 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
11170 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
11180 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
11190 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
111a0 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
111b0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
111c0 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
111d0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
111e0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
111f0 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
11200 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
11210 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
11220 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
11230 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
11240 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
11250 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
11260 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11270 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
11280 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
11290 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
112a0 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
112b0 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
112c0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
112d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
112e0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
112f0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
11300 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
11310 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
11320 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11330 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
11340 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
11350 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
11360 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
11370 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
11380 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
11390 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
113a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
113b0 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
113c0 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
113d0 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
113e0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
113f0 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
11400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
11410 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
11420 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
11430 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
11440 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
11450 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
11460 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
11470 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
11480 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
11490 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
114a0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
114b0 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
114c0 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
114d0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
114e0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
114f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
11500 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
11510 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
11520 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
11530 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11540 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
11550 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
11560 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
11570 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
11580 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
11590 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
115a0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
115b0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
115c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
115d0 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
115e0 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
115f0 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
11600 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
11610 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
11620 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
11630 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11640 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
11650 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
11660 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
11670 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11680 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
11690 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
116a0 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65  matedCost);.}.#e
116b0 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
116c0 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
116d0 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
116e0 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
116f0 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75  dif../* .** Requ
11700 69 72 65 64 20 62 65 63 61 75 73 65 20 62 65 73  ired because bes
11710 74 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c  tIndex() is call
11720 65 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75  ed by bestOrClau
11730 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74  seIndex() .*/.st
11740 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e  atic void bestIn
11750 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
11760 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  *);../*.** This 
11770 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
11780 20 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e   to find an scan
11790 6e 69 6e 67 20 73 74 72 61 74 65 67 79 20 74 68  ning strategy th
117a0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  at can be used .
117b0 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
117c0 6e 20 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f  n 'OR' expressio
117d0 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
117e0 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  f a WHERE clause
117f0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  . .**.** The tab
11800 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
11810 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
11820 65 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20  erm pSrc may be 
11830 65 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75  either a.** regu
11840 6c 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65  lar B-Tree table
11850 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
11860 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
11870 6f 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65  oid bestOrClause
11880 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49  Index(WhereBestI
11890 64 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20  dx *p){.#ifndef 
118a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
118b0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68  PTIMIZATION.  Wh
118c0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
118d0 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20   p->pWC;        
118e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
118f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
11900 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
11910 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11920 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11930 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
11940 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ch */.  const in
11950 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
11960 43 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20  Cursor;      /* 
11970 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
11980 65 20 74 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f  e table  */.  co
11990 6e 73 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  nst Bitmask mask
119a0 53 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57  Src = getMask(pW
119b0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
119c0 72 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20  r);  /* Bitmask 
119d0 66 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68  for pSrc */.  Wh
119e0 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
119f0 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
11a00 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20  [pWC->nTerm];   
11a10 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
11a20 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  WC->a[] */.  Whe
11a30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
11a60 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
11a70 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20  clause */..  /* 
11a80 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70  The OR-clause op
11a90 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69  timization is di
11aa0 73 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20  sallowed if the 
11ab0 49 4e 44 45 58 45 44 20 42 59 20 6f 72 0a 20 20  INDEXED BY or.  
11ac0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  ** NOT INDEXED c
11ad0 6c 61 75 73 65 73 20 61 72 65 20 75 73 65 64 20  lauses are used 
11ae0 6f 72 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  or if the WHERE_
11af0 41 4e 44 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20  AND_ONLY bit is 
11b00 73 65 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  set. */.  if( pS
11b10 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c  rc->notIndexed |
11b20 7c 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d  | pSrc->pIndex!=
11b30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
11b40 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
11b50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
11b60 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_AND_ONLY ){. 
11b70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
11b80 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
11b90 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11ba0 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20  ms for a usable 
11bb0 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20  WO_OR term. */. 
11bc0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
11bd0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
11be0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
11bf0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
11c00 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
11c10 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d  .     && ((pTerm
11c20 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d  ->prereqAll & ~m
11c30 61 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f 74  askSrc) & p->not
11c40 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 26  Ready)==0.     &
11c50 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
11c60 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
11c70 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20 20   maskSrc)!=0 .  
11c80 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
11c90 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
11ca0 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
11cb0 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
11cc0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
11cd0 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
11ce0 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
11cf0 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
11d00 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
11d10 72 6d 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  rm;.      double
11d20 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20   rTotal = 0;.   
11d30 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d     double nRow =
11d40 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   0;.      Bitmas
11d50 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  k used = 0;.    
11d60 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20 73    WhereBestIdx s
11d70 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73 42 4f 49  BOI;..      sBOI
11d80 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20 73 42 4f   = *p;.      sBO
11d90 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  I.pOrderBy = 0;.
11da0 20 20 20 20 20 20 73 42 4f 49 2e 70 44 69 73 74        sBOI.pDist
11db0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
11dc0 73 42 4f 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d  sBOI.ppIdxInfo =
11dd0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f   0;.      for(pO
11de0 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
11df0 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
11e00 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
11e10 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41        /*WHERETRA
11e20 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69  CE(("... Multi-i
11e30 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20  ndex OR testing 
11e40 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25  for term %d of %
11e50 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20  d....\n", .     
11e60 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20       (pOrTerm - 
11e70 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72  pOrWC->a), (pTer
11e80 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20  m - pWC->a).    
11e90 20 20 20 20 29 29 3b 2a 2f 0a 20 20 20 20 20 20      ));*/.      
11ea0 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
11eb0 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e  eOperator& WO_AN
11ec0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
11ed0 20 20 20 73 42 4f 49 2e 70 57 43 20 3d 20 26 70     sBOI.pWC = &p
11ee0 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
11ef0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
11f00 20 20 62 65 73 74 49 6e 64 65 78 28 26 73 42 4f    bestIndex(&sBO
11f10 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  I);.        }els
11f20 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
11f30 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
11f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
11f50 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
11f60 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
11f70 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e  C.pParse = pWC->
11f80 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
11f90 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65    tempWC.pMaskSe
11fa0 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  t = pWC->pMaskSe
11fb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  t;.          tem
11fc0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
11fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
11fe0 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
11ff0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
12000 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
12010 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 77          tempWC.w
12020 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ctrlFlags = 0;. 
12030 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
12040 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
12050 20 20 20 20 20 73 42 4f 49 2e 70 57 43 20 3d 20       sBOI.pWC = 
12060 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
12070 20 20 20 62 65 73 74 49 6e 64 65 78 28 26 73 42     bestIndex(&sB
12080 4f 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  OI);.        }el
12090 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
120a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
120b0 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  }.        rTotal
120c0 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 72 43   += sBOI.cost.rC
120d0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  ost;.        nRo
120e0 77 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 70  w += sBOI.cost.p
120f0 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  lan.nRow;.      
12100 20 20 75 73 65 64 20 7c 3d 20 73 42 4f 49 2e 63    used |= sBOI.c
12110 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20  ost.used;.      
12120 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 2d    if( rTotal>=p-
12130 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 20 62 72  >cost.rCost ) br
12140 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
12150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
12160 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
12170 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20  lause, increase 
12180 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f  the scan cost to
12190 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20   account .      
121a0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20  ** for the cost 
121b0 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a  of the sort. */.
121c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
121d0 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20  derBy!=0 ){.    
121e0 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45      /*WHERETRACE
121f0 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69  (("... sorting i
12200 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74  ncreases OR cost
12210 20 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22   %.9g to %.9g\n"
12220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12230 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54        rTotal, rT
12240 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67  otal+nRow*estLog
12250 28 6e 52 6f 77 29 29 29 3b 2a 2f 0a 20 20 20 20  (nRow)));*/.    
12260 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52      rTotal += nR
12270 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b  ow*estLog(nRow);
12280 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12290 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74 20 6f  /* If the cost o
122a0 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67  f scanning using
122b0 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20 66 6f   this OR term fo
122c0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  r optimization i
122d0 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
122e0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
122f0 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69 6e 20   cost stored in 
12300 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65 20 74  pCost, replace t
12310 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
12320 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a    ** of pCost. *
12330 2f 0a 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54  /.      /*WHERET
12340 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69  RACE(("... multi
12350 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25  -index OR cost=%
12360 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22  .9g nrow=%.9g\n"
12370 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29  , rTotal, nRow))
12380 3b 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 54  ;*/.      if( rT
12390 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f  otal<p->cost.rCo
123a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  st ){.        p-
123b0 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 54  >cost.rCost = rT
123c0 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  otal;.        p-
123d0 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73 65  >cost.used = use
123e0 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  d;.        p->co
123f0 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  st.plan.nRow = n
12400 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Row;.        p->
12410 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  cost.plan.nOBSat
12420 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65   = p->i ? p->aLe
12430 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
12440 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 20  .nOBSat : 0;.   
12450 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
12460 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
12470 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
12480 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
12490 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d  .u.pTerm = pTerm
124a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
124b0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
124c0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
124d0 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a  IMIZATION */.}..
124e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
124f0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
12500 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
12510 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
12520 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
12530 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
12540 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
12550 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
12560 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
12570 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
12580 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
12590 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
125a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
125b0 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
125c0 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
125d0 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
125e0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
125f0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
12600 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
12610 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
12620 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
12630 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
12640 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
12650 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12670 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
12680 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
12690 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
126a0 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
126b0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
126c0 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
126d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
126e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
126f0 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
12700 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
12710 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
12720 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
12730 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12740 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
12750 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
12760 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
12770 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
12780 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
12790 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
127a0 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
127b0 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
127c0 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
127d0 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
127e0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 1;.}.#endif..#
127f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12800 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
12810 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  EX./*.** If the 
12820 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70  query plan for p
12830 53 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e  Src specified in
12840 20 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c   pCost is a full
12850 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61   table scan.** a
12860 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61  nd indexing is a
12870 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20  llows (if there 
12880 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45  is no NOT INDEXE
12890 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74  D clause) and it
128a0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
128b0 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e  construct a tran
128c0 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74  sient index that
128d0 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62   would perform b
128e0 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20  etter.** than a 
128f0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
12900 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f  even when the co
12910 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69  st of constructi
12920 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
12930 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63  is taken into ac
12940 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65  count, then alte
12950 72 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  r the query plan
12960 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74   to use the.** t
12970 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a  ransient index..
12980 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
12990 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  estAutomaticInde
129a0 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a  x(WhereBestIdx *
129b0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
129c0 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
129d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
129e0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
129f0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
12a00 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
12a10 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
12a20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
12a30 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
12a40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
12a50 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f 2a 20   = p->pSrc;  /* 
12a60 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
12a70 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
12a80 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c  /.  double nTabl
12a90 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  eRow;           
12aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
12ab0 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74  s in the input t
12ac0 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  able */.  double
12ad0 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20   logN;          
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  /* log(nTableRow
12b00 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  ) */.  double co
12b10 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20  stTempIdx;      
12b20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20     /* per-query 
12b30 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e  cost of the tran
12b40 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
12b50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
12b60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
12b70 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
12b80 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
12b90 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
12ba0 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
12bb0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
12bc0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65  ->a[] */.  Table
12bd0 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
12be0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12bf0 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64  tht might be ind
12c00 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70  exed */..  if( p
12c10 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
12c20 70 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a  p<=(double)1 ){.
12c30 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
12c40 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c  no point in buil
12c50 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
12c60 63 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69  c index for a si
12c70 6e 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  ngle scan */.   
12c80 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
12c90 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
12ca0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
12cb0 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a  utoIndex)==0 ){.
12cc0 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
12cd0 20 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73   indices are dis
12ce0 61 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  abled at run-tim
12cf0 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  e */.    return;
12d00 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 63  .  }.  if( (p->c
12d10 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
12d20 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
12d30 4c 53 43 41 4e 29 21 3d 30 0a 20 20 20 26 26 20  LSCAN)!=0.   && 
12d40 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  (p->cost.plan.ws
12d50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
12d60 56 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 29  VER_SCAN)==0.  )
12d70 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65  {.    /* We alre
12d80 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69  ady have some ki
12d90 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75  nd of index in u
12da0 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  se for this quer
12db0 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
12dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
12dd0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  ->viaCoroutine )
12de0 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  {.    /* Cannot 
12df0 69 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75 74 69  index a co-routi
12e00 6e 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ne */.    return
12e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
12e20 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
12e30 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49      /* The NOT I
12e40 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70  NDEXED clause ap
12e50 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c  pears in the SQL
12e60 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
12e70 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
12e80 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b  >isCorrelated ){
12e90 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72  .    /* The sour
12ea0 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  ce is a correlat
12eb0 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f  ed sub-query. No
12ec0 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69   point in indexi
12ed0 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  ng it. */.    re
12ee0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  turn;.  }..  ass
12ef0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ert( pParse->nQu
12f00 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62  eryLoop >= (doub
12f10 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65  le)1 );.  pTable
12f20 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
12f30 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61   nTableRow = pTa
12f40 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
12f50 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54  logN = estLog(nT
12f60 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74  ableRow);.  cost
12f70 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e  TempIdx = 2*logN
12f80 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72  *(nTableRow/pPar
12f90 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
12fa0 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54   1);.  if( costT
12fb0 65 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e  empIdx>=p->cost.
12fc0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
12fd0 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
12fe0 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
12ff0 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
13000 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
13010 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
13020 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
13030 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
13040 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
13050 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
13060 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
13070 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
13080 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
13090 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
130a0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
130b0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
130c0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
130d0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
130e0 20 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52 65 61   pSrc, p->notRea
130f0 64 79 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 57  dy) ){.      /*W
13100 48 45 52 45 54 52 41 43 45 28 28 22 61 75 74 6f  HERETRACE(("auto
13110 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73 20 63  -index reduces c
13120 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f  ost from %.1f to
13130 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20   %.1f\n",.      
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
13150 3e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73  >cost.rCost, cos
13160 74 54 65 6d 70 49 64 78 29 29 3b 2a 2f 0a 20 20  tTempIdx));*/.  
13170 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73      p->cost.rCos
13180 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b  t = costTempIdx;
13190 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
131a0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20  lan.nRow = logN 
131b0 2b 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  + 1;.      p->co
131c0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
131d0 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
131e0 45 58 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  EX;.      p->cos
131f0 74 2e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  t.used = pTerm->
13200 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
13210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13220 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
13230 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
13240 69 63 49 6e 64 65 78 28 41 29 20 20 2f 2a 20 6e  icIndex(A)  /* n
13250 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  o-op */.#endif /
13260 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
13270 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
13280 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
13290 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
132a0 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
132b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
132c0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
132d0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
132e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
132f0 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
13300 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
13310 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
13320 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
13330 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
13340 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
13350 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
13360 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
13370 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
13380 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13390 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
133a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
133b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
133c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
133d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
133e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
133f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13400 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13410 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13420 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
13430 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
13440 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
13450 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
13460 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
13470 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
13480 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
13490 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
134a0 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
134b0 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
134c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
134d0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
134e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
134f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
13500 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
13510 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13520 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13530 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
13540 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
13550 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
13560 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
13570 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
13580 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
13590 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
135c0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
135d0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
135e0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
135f0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
13600 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
13610 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
13620 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13640 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
13650 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
13660 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
13670 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
13680 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13690 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
136a0 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
136b0 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
136c0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
136d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
136e0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
136f0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13700 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
13710 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
13720 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
13730 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
13740 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
13750 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
13760 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
13770 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
13780 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
13790 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
137a0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
137b0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
137c0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
137d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
137e0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
137f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13810 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13820 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
13850 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
13860 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
13870 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13880 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
13890 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
138a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d  column */.  Bitm
138b0 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
138c0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
138d0 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
138e0 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
138f0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
13900 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
13910 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
13920 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
13930 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
13940 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
13950 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
13960 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
13970 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
13980 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
13990 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
139a0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
139b0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
139c0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
139d0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
139e0 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
139f0 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
13a00 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
13a10 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
13a20 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
13a30 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
13a40 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
13a50 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
13a60 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
13a70 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
13a80 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30  */.  nColumn = 0
13a90 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
13aa0 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
13ab0 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
13ac0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f  >nTerm];.  idxCo
13ad0 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
13ae0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
13af0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
13b00 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
13b10 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
13b20 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
13b30 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
13b40 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
13b50 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
13b60 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
13b70 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
13b80 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
13b90 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73  MS-1) : ((Bitmas
13ba0 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20  k)1)<<iCol;.    
13bb0 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
13bc0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
13bd0 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
13be0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
13bf0 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
13c00 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
13c10 20 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20    nColumn++;.   
13c20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
13c30 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  cMask;.      }. 
13c40 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
13c50 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a  t( nColumn>0 );.
13c60 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e    pLevel->plan.n
13c70 45 71 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  Eq = nColumn;.. 
13c80 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
13c90 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
13ca0 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
13cb0 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
13cc0 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
13cd0 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
13ce0 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
13cf0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
13d00 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
13d10 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
13d20 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
13d30 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
13d40 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
13d50 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
13d60 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
13d70 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
13d80 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
13d90 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
13da0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
13db0 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
13dc0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
13dd0 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
13de0 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
13df0 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
13e00 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
13e10 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
13e20 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
13e30 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
13e40 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
13e50 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
13e60 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28  & (~idxCols | ((
13e70 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
13e80 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43  S-1)));.  mxBitC
13e90 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43  ol = (pTable->nC
13ea0 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42  ol >= BMS-1) ? B
13eb0 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e  MS-1 : pTable->n
13ec0 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Col;.  testcase(
13ed0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
13ee0 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
13ef0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
13f00 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
13f10 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
13f20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13f30 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
13f40 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20  itmask)1)<<i) ) 
13f50 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20  nColumn++;.  }. 
13f60 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
13f70 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
13f80 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
13f90 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70      nColumn += p
13fa0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
13fb0 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65  S + 1;.  }.  pLe
13fc0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
13fd0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
13fe0 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
13ff0 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  _ONLY;..  /* Con
14000 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
14010 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
14020 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
14030 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  /.  nByte = size
14040 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79  of(Index);.  nBy
14050 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
14060 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f  zeof(int);     /
14070 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
14080 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
14090 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68  Column*sizeof(ch
140a0 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ar*);   /* Index
140b0 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79  .azColl */.  nBy
140c0 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20  te += nColumn;  
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
140e0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
140f0 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  er */.  pIdx = s
14100 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
14110 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
14120 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64  Byte);.  if( pId
14130 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
14140 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
14150 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  pIdx = pIdx;.  p
14160 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
14170 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a  har**)&pIdx[1];.
14180 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
14190 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e   = (int*)&pIdx->
141a0 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b  azColl[nColumn];
141b0 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
141c0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78  der = (u8*)&pIdx
141d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
141e0 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  mn];.  pIdx->zNa
141f0 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
14200 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ";.  pIdx->nColu
14210 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = nColumn;.  
14220 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
14230 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
14240 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
14250 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
14260 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
14270 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14280 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
14290 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
142a0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
142b0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
142c0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
142d0 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
142e0 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
142f0 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
14300 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
14310 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
14320 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  l;.      if( (id
14330 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
14340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
14350 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
14360 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
14370 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
14380 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
14390 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
143a0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
143b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
143c0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
143d0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
143e0 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
143f0 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
14400 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
14410 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43  l[n] = ALWAYS(pC
14420 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  oll) ? pColl->zN
14430 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
14440 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
14450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14460 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
14470 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45  =pLevel->plan.nE
14480 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
14490 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
144a0 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
144b0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
144c0 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
144d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
144e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
144f0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
14500 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
14510 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
14520 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70  )<<i) ){.      p
14530 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
14540 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
14550 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
14560 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
14570 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
14580 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
14590 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
145a0 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
145b0 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
145c0 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
145d0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
145e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
145f0 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
14600 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
14610 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
14620 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
14630 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
14640 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
14650 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
14660 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
14670 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
14680 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
14690 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
146a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
146b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
146c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
146d0 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
146e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
146f0 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20  Column+1, 0,.   
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f   (char*)pKeyinfo
14720 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
14730 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d  DOFF);.  VdbeCom
14740 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
14750 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
14760 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
14770 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
14780 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
14790 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
147a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
147b0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
147c0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
147d0 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
147e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
147f0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
14800 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
14810 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
14820 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
14830 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29  r, regRecord, 1)
14840 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14850 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
14860 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
14870 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
14880 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
14890 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
148a0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
148b0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
148c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
148d0 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
148e0 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
148f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
14900 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
14910 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
14920 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
14930 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14940 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
14950 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14960 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
14970 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
14980 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
14990 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
149a0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
149b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
149c0 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
149d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
149e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
149f0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
14a00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14a10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
14a20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
14a30 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
14a40 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14a50 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
14a60 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
14a70 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14a80 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14a90 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
14aa0 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
14ab0 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
14ac0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
14ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
14ae0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14af0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
14b00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
14b10 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
14b20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14b30 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
14b40 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
14b50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14b60 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
14b70 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
14b80 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
14b90 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
14ba0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14bb0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
14bc0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
14bd0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14be0 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
14bf0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14c00 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14c10 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
14c20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14c30 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
14c40 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
14c50 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
14c60 66 6f 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52  fo;..  /*WHERETR
14c70 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e  ACE(("Recomputin
14c80 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72  g index info for
14c90 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d   %s...\n", pSrc-
14ca0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a  >pTab->zName));*
14cb0 2f 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  /..  /* Count th
14cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
14cd0 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
14ce0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
14cf0 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
14d00 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
14d10 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
14d20 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
14d30 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
14d40 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
14d50 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
14d60 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
14d70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
14d80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14d90 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
14da0 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
14db0 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
14dc0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14dd0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14de0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
14df0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14e00 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14e10 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
14e20 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
14e30 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
14e40 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
14e50 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14e60 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
14e70 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
14e80 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
14e90 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
14ea0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
14eb0 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
14ec0 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
14ed0 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
14ee0 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
14ef0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
14f00 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
14f10 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
14f20 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14f30 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
14f40 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
14f50 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
14f60 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
14f70 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
14f80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
14f90 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
14fa0 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
14fb0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
14fc0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
14fd0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
14fe0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
14ff0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15000 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15010 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
15020 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
15030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15040 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
15050 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15060 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
15070 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
15080 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
15090 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
150a0 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
150d0 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
150e0 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
150f0 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
15120 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
15130 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
15140 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
15150 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15160 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
15170 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28  mory");.    /* (
15180 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
15190 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
151a0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
151b0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
151c0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
151d0 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
151e0 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
151f0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
15200 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
15210 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
15220 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
15230 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
15240 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
15250 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
15260 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
15270 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
15280 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
15290 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
152a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
152b0 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
152c0 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
152d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
152e0 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
152f0 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
15300 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
15310 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
15320 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
15330 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73  ns[nTerm];.  pUs
15340 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71  age = (struct sq
15350 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15360 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70  traint_usage*)&p
15370 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65  IdxOrderBy[nOrde
15380 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  rBy];.  *(int*)&
15390 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
153a0 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20  raint = nTerm;. 
153b0 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
153c0 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
153d0 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
153e0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
153f0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
15400 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
15410 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
15420 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
15430 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
15440 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
15450 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
15460 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
15470 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
15480 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
15490 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
154a0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
154b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66      pUsage;..  f
15500 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
15510 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
15520 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
15530 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a  ++){.    u8 op;.
15540 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
15550 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
15560 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
15570 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
15580 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
15590 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
155a0 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
155b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
155c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
155d0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
155e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
155f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
15600 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
15610 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15620 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
15630 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15640 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
15650 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
15660 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15670 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
15680 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
15690 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
156a0 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
156b0 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
156c0 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
156d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
156e0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
156f0 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
15700 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  EQ;.    pIdxCons
15710 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20  [j].op = op;.   
15720 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
15730 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
15740 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
15750 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
15760 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
15770 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
15780 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15790 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
157a0 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
157b0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
157c0 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
157d0 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
157e0 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
157f0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15800 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
15810 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
15820 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15830 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
15840 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
15850 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
15860 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
15870 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
15880 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
15890 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
158a0 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
158b0 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
158c0 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
158d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
158e0 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
158f0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
15900 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
15910 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
15920 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
15930 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
15940 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
15950 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
15960 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
15970 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
15980 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
15990 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
159a0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
159b0 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
159c0 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
159d0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
159e0 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
159f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15a00 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
15a10 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
15a20 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
15a30 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
15a40 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
15a50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
15a60 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15a70 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
15a80 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
15a90 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
15aa0 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
15ab0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
15ac0 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
15ad0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
15ae0 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
15af0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e  _index_info poin
15b00 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
15b10 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
15b20 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
15b30 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
15b40 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
15b50 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
15b60 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
15b70 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
15b80 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15b90 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
15ba0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
15bb0 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
15bc0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15bd0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
15be0 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
15bf0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
15c00 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
15c10 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
15c20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15c30 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
15c40 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
15c50 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
15c60 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
15c70 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
15c80 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
15c90 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
15ca0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
15cb0 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
15cc0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15cd0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
15ce0 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
15cf0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
15d00 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
15d10 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
15d20 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
15d30 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
15d40 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43  ;..  /*WHERETRAC
15d50 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66  E(("xBestIndex f
15d60 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e  or %s\n", pTab->
15d70 7a 4e 61 6d 65 29 29 3b 2a 2f 0a 20 20 54 52 41  zName));*/.  TRA
15d80 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
15d90 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
15da0 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
15db0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
15dc0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
15dd0 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
15de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15df0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15e00 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
15e10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15e20 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
15e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
15e40 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
15e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15e60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
15e70 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
15e80 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
15e90 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
15ea0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15eb0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
15ec0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
15ed0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
15ee0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
15ef0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
15f00 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
15f10 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
15f20 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
15f30 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
15f40 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
15f50 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
15f60 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
15f70 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
15f80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15f90 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15fa0 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
15fb0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
15fc0 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
15fd0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15fe0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
15ff0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
16000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
16010 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
16020 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
16030 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
16040 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
16050 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
16060 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
16070 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
16080 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
16090 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
160a0 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
160b0 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
160c0 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
160d0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
160e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
160f0 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
16100 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
16110 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
16120 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
16130 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
16140 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
16150 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
16160 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
16170 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
16180 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
16190 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
161a0 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
161b0 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
161c0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
161d0 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
161e0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
161f0 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
16200 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
16210 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
16220 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
16230 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
16240 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
16250 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
16260 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
16270 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
16280 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
16290 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
162a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
162b0 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
162c0 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
162d0 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
162e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
162f0 64 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  d bestVirtualInd
16300 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
16310 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
16320 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
16330 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
16340 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16350 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
16360 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
16370 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
16380 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
16390 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
163a0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
163b0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
163c0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
163d0 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
163e0 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
163f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
16400 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
16410 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
16420 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
16430 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
16440 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
16450 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
16460 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
16470 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
16480 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
16490 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
164a0 20 20 69 6e 74 20 62 41 6c 6c 6f 77 49 4e 3b 20    int bAllowIN; 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 2f 2a 20 41 6c 6c 6f 77 20 49 4e 20 6f 70    /* Allow IN op
164d0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20  timizations */. 
164e0 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a   double rCost;..
164f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
16500 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61  sFlags is initia
16510 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61  lized to some sa
16520 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77  ne value. Otherw
16530 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a  ise, if the .  *
16540 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f  * malloc in allo
16550 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20  cateIndexInfo() 
16560 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66  fails and this f
16570 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
16580 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46  leaving.  ** wsF
16590 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69  lags in an unini
165a0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20  tialized state, 
165b0 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62  the caller may b
165c0 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74 61  ehave unpredicta
165d0 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  bly..  */.  mems
165e0 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20  et(&p->cost, 0, 
165f0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29  sizeof(p->cost))
16600 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  ;.  p->cost.plan
16610 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
16620 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a  _VIRTUALTABLE;..
16630 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
16640 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
16650 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
16660 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
16670 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
16680 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  and initialized,
16690 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
166a0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
166b0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64   now..  */.  pId
166c0 78 49 6e 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64  xInfo = *p->ppId
166d0 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
166e0 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
166f0 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20  *p->ppIdxInfo = 
16700 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
16710 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
16720 72 73 65 2c 70 57 43 2c 70 53 72 63 2c 70 2d 3e  rse,pWC,pSrc,p->
16730 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
16740 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
16750 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
16760 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
16770 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c  s point, the sql
16780 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
16790 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70  structure that p
167a0 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20  IdxInfo points. 
167b0 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65   ** to will have
167c0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
167d0 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67  d, either during
167e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
167f0 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20  ocation or.  ** 
16800 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f  during some prio
16810 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e  r invocation.  N
16820 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  ow we just have 
16830 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
16840 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66  .  ** details of
16850 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68   pIdxInfo for th
16860 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
16870 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74  tion and pass it
16880 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e   to.  ** xBestIn
16890 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  dex..  */..  /* 
168a0 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  The module name 
168b0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e  must be defined.
168c0 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70   Also, by this p
168d0 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a  oint there must.
168e0 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65    ** be a pointe
168f0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
16900 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
16910 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73  Otherwise.  ** s
16920 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
16930 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64  umnNames() would
16940 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20   have picked up 
16950 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f  the error. .  */
16960 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
16970 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
16980 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
16990 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  g[0] );.  assert
169a0 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  ( sqlite3GetVTab
169b0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
169c0 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 72  Tab) );..  /* Tr
169d0 79 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e  y once or twice.
169e0 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 61    On the first a
169f0 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77 20 49 4e  ttempt, allow IN
16a00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 0a   optimizations..
16a10 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e 20 6f 70    ** If an IN op
16a20 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 63  timization is ac
16a30 63 65 70 74 65 64 20 62 79 20 74 68 65 20 76 69  cepted by the vi
16a40 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73  rtual table xBes
16a50 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d 65 74 68  tIndex.  ** meth
16a60 6f 64 2c 20 62 75 74 20 74 68 65 20 20 70 49 6e  od, but the  pIn
16a70 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 55 73  fo->aConstrainUs
16a80 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67 20 69 73  age.omit flag is
16a90 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 0a 20   not set, then. 
16aa0 20 2a 2a 20 74 68 65 20 71 75 65 72 79 20 77 69   ** the query wi
16ab0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62 65 63 61  ll not work beca
16ac0 75 73 65 20 69 74 20 6d 69 67 68 74 20 61 6c 6c  use it might all
16ad0 6f 77 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  ow duplicate row
16ae0 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74 70 75 74  s in.  ** output
16af0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
16b00 20 72 75 6e 20 74 68 65 20 78 42 65 73 74 49 6e   run the xBestIn
16b10 64 65 78 20 6d 65 74 68 6f 64 20 61 20 73 65 63  dex method a sec
16b20 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a 20 77 69  ond time.  ** wi
16b30 74 68 6f 75 74 20 74 68 65 20 49 4e 20 63 6f 6e  thout the IN con
16b40 73 74 72 61 69 6e 74 73 2e 20 20 55 73 75 61 6c  straints.  Usual
16b50 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  ly this loop onl
16b60 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
16b70 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  * The loop will 
16b80 65 78 69 74 20 75 73 69 6e 67 20 61 20 22 62 72  exit using a "br
16b90 65 61 6b 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a  eak" statement..
16ba0 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41 6c 6c 6f    */.  for(bAllo
16bb0 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c 6c 6f 77  wIN=1; 1; bAllow
16bc0 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73 73 65 72  IN--){.    asser
16bd0 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d 30 20 7c  t( bAllowIN==0 |
16be0 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31 20 29 3b  | bAllowIN==1 );
16bf0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
16c00 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
16c10 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
16c20 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
16c30 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 76  .    ** output v
16c40 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f  ariables to zero
16c50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16c60 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
16c70 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72  able is true for
16c80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65   constraints whe
16c90 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
16ca0 64 0a 20 20 20 20 2a 2a 20 73 69 64 65 20 63 6f  d.    ** side co
16cb0 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65  ntains only refe
16cc0 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73  rences to tables
16cd0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
16ce0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
16cf0 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ** table.  In ot
16d00 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
16d10 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
16d20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
16d30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
16d40 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78       column = ex
16d50 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  pr.    **.    **
16d60 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c   and we are eval
16d70 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74  uating a join, t
16d80 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
16d90 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20  nt on column is 
16da0 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c  .    ** only val
16db0 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73  id if all tables
16dc0 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65   referenced in e
16dd0 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65  xpr occur to the
16de0 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 6f 66 20   left.    ** of 
16df0 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
16e00 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  ning column..   
16e10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
16e20 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72  Constraints[] ar
16e30 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ray contains ent
16e40 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  ries for all con
16e50 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20  straints.    ** 
16e60 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
16e70 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
16e80 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
16e90 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
16ea0 20 20 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75      ** even thou
16eb0 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20  gh we might try 
16ec0 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74  to pick the best
16ed0 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20   index multiple 
16ee0 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 46 6f  times..    ** Fo
16ef0 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
16f00 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
16f10 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
16f20 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
16f30 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74     ** join might
16f40 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f   be different so
16f50 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f   we have to reco
16f60 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65  mpute the usable
16f70 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 65 61 63   flag.    ** eac
16f80 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  h time..    */. 
16f90 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
16fa0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
16fb0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
16fc0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
16fd0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 55  nstraint;.    pU
16fe0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
16ff0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
17000 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
17010 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
17020 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
17030 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
17040 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
17050 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
17060 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
17070 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[j];.      if( 
17080 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
17090 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61 64 79 29  ght&p->notReady)
170a0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 62  ==0.       && (b
170b0 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70 54 65 72  AllowIN || (pTer
170c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
170d0 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20 20 20 20  O_IN)==0).      
170e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 43  ){.        pIdxC
170f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
17100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17110 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
17120 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
17130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
17140 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
17150 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
17160 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
17170 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
17180 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
17190 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
171a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
171b0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
171c0 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Str);.    }.    
171d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
171e0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
171f0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
17200 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
17210 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
17220 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
17230 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
17240 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 28 28  d = 0;.    /* ((
17250 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73  double)2) In cas
17260 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
17270 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
17280 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e  .. */.    pIdxIn
17290 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
172a0 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
172b0 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29  BL / ((double)2)
172c0 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  ;.    nOrderBy =
172d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
172e0 72 42 79 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  rBy;.    if( !p-
172f0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
17300 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
17310 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
17320 0a 20 20 0a 20 20 20 20 69 66 28 20 76 74 61 62  .  .    if( vtab
17330 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
17340 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
17350 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
17360 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
17370 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
17380 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
17390 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
173a0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
173b0 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
173c0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
173d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
173e0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
173f0 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b       if( pUsage[
17400 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
17410 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
17420 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
17430 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 54 65  set;.        pTe
17440 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
17450 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  .        p->cost
17460 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e  .used |= pTerm->
17470 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
17480 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
17490 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
174a0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
174b0 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
174c0 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
174d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
174e0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
174f0 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
17500 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
17510 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
17520 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
17530 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
17540 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
17550 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
17560 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
17570 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
17580 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
17590 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
175a0 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
175b0 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
175c0 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
175d0 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
175e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
175f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17600 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
17610 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
17620 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
17630 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
17640 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
17650 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
17660 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17670 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
17680 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
17690 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
176a0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
176b0 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
176c0 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
176d0 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
176e0 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
176f0 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
17700 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
17710 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
17720 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
17730 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
17740 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
17750 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
17760 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
17770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17780 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 49 6e     if( i>=pIdxIn
17790 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
177a0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
177b0 2f 2a 20 54 68 65 20 6f 72 64 65 72 42 79 43 6f  /* The orderByCo
177c0 6e 73 75 6d 65 64 20 73 69 67 6e 61 6c 20 69 73  nsumed signal is
177d0 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
177e0 6c 6c 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 63  ll outer loops c
177f0 6f 6c 6c 65 63 74 69 76 65 6c 79 0a 20 20 2a 2a  ollectively.  **
17800 20 67 65 6e 65 72 61 74 65 20 6a 75 73 74 20 61   generate just a
17810 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
17820 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
17830 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  ( pIdxInfo->orde
17840 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20  rByConsumed ){. 
17850 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
17860 3e 69 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >i; i++){.      
17870 69 66 28 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 69  if( (p->aLevel[i
17880 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
17890 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 3d 3d   WHERE_UNIQUE)==
178a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  0 ){.        pId
178b0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
178c0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
178d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
178e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
178f0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17900 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
17910 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
17920 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
17930 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
17940 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
17950 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
17960 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
17970 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
17980 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
17990 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
179a0 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
179b0 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
179c0 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
179d0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
179e0 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  ost;.  if( p->pO
179f0 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
17a00 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
17a10 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
17a20 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
17a30 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
17a40 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
17a50 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
17a60 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
17a70 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
17a80 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
17a90 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
17aa0 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
17ab0 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
17ac0 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
17ad0 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
17ae0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
17af0 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
17b00 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
17b10 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
17b20 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
17b30 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17b40 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
17b50 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
17b60 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
17b70 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
17b80 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  st ){.    p->cos
17b90 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
17ba0 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
17bb0 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  le)2));.  }else{
17bc0 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  .    p->cost.rCo
17bd0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
17be0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
17bf0 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
17c00 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
17c10 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
17c20 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  sumed ){.    p->
17c30 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
17c40 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
17c50 45 44 3b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ED;.    p->cost.
17c60 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e 4f  plan.nOBSat = nO
17c70 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
17c80 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  .    p->cost.pla
17c90 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d 3e 69 20  n.nOBSat = p->i 
17ca0 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69  ? p->aLevel[p->i
17cb0 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  -1].plan.nOBSat 
17cc0 3a 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  : 0;.  }.  p->co
17cd0 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b  st.plan.nEq = 0;
17ce0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  .  pIdxInfo->nOr
17cf0 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
17d00 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  ;..  /* Try to f
17d10 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63  ind a more effic
17d20 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74 74  ient access patt
17d30 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c  ern by using mul
17d40 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20  tiple indexes.  
17d50 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
17d60 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20  n OR expression 
17d70 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45  within the WHERE
17d80 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20   clause. .  */. 
17d90 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
17da0 65 78 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ex(p);.}.#endif 
17db0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
17dc0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
17dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17de0 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a  ABLE_STAT3./*.**
17df0 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
17e00 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74  cation of a part
17e10 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67  icular key among
17e20 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a   all keys in an.
17e30 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65  ** index.  Store
17e40 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
17e50 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73  aStat as follows
17e60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74  :.**.**    aStat
17e70 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [0]      Est. nu
17e80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73  mber of rows les
17e90 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20  s than pVal.**  
17ea0 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20    aStat[1]      
17eb0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
17ec0 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56 61  ows equal to pVa
17ed0 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  l.**.** Return S
17ee0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
17ef0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
17f00 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
17f10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17f20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17f30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
17f40 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
17f50 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
17f60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17f70 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
17f80 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69  ain of */.  sqli
17f90 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
17fa0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
17fb0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
17fc0 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fe0 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
17ff0 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
18000 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
18010 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
18020 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
18030 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
18040 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77  ere */.){.  tRow
18050 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53 61  cnt n;.  IndexSa
18060 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a 20  mple *aSample;. 
18070 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a 20   int i, eType;. 
18080 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a 20   int isEq = 0;. 
18090 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c 65   i64 v;.  double
180a0 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65 72   r, rS;..  asser
180b0 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c  t( roundUp==0 ||
180c0 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20   roundUp==1 );. 
180d0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
180e0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69 66  Sample>0 );.  if
180f0 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74 75  ( pVal==0 ) retu
18100 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
18110 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69 52  .  n = pIdx->aiR
18120 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61 6d  owEst[0];.  aSam
18130 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
18140 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  ple;.  eType = s
18150 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
18160 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20  e(pVal);..  if( 
18170 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
18180 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20 3d  TEGER ){.    v =
18190 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
181a0 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20 20  nt64(pVal);.    
181b0 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20 20  r = (i64)v;.    
181c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
181d0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
181e0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
181f0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
18200 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
18210 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
18220 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
18230 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
18240 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
18250 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
18260 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
18270 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
18280 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76  Sample[i].u.i>=v
18290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
182a0 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
182b0 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20 20  u.i==v;.        
182c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
182d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
182e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
182f0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
18300 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
18310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  ;.        if( aS
18320 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20  ample[i].u.r>=r 
18330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 45  ){.          isE
18340 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  q = aSample[i].u
18350 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 20  .r==r;.         
18360 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
18370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18380 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70    }else if( eTyp
18390 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
183a0 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74  ){.    r = sqlit
183b0 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
183c0 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  pVal);.    for(i
183d0 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
183e0 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
183f0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
18400 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
18410 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
18420 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
18430 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54  [i].eType>=SQLIT
18440 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a  E_TEXT ) break;.
18450 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
18460 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
18470 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
18480 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
18490 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20 7d  [i].u.r;.      }
184a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 53  else{.        rS
184b0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e   = aSample[i].u.
184c0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
184d0 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20 20   if( rS>=r ){.  
184e0 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53 3d        isEq = rS=
184f0 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  =r;.        brea
18500 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18510 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
18520 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
18530 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  ){.    i = 0;.  
18540 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30 5d    if( aSample[0]
18550 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
18560 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b 0a  ULL ) isEq = 1;.
18570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
18580 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
18590 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
185a0 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
185b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
185c0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
185d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
185e0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
185f0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
18600 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
18610 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
18620 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18640 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 53    if( i<pIdx->nS
18650 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a 20  ample ){      . 
18660 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
18670 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18680 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
18690 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  oll;.      const
186a0 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69 66   u8 *z;.      if
186b0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
186c0 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
186d0 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
186e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
186f0 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  ob(pVal);.      
18700 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
18710 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
18720 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e   assert( pColl->
18730 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
18740 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
18750 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
18760 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
18770 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  eq(pParse, SQLIT
18780 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78  E_UTF8, 0, *pIdx
18790 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
187a0 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
187b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
187c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
187d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
187e0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
187f0 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65  8 *)sqlite3Value
18800 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  Text(pVal, pColl
18810 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  ->enc);.        
18820 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20  if( !z ){.      
18830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18840 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
18850 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
18860 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26  t( z && pColl &&
18870 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
18880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20        }.      n 
18890 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79  = sqlite3ValueBy
188a0 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d  tes(pVal, pColl-
188b0 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20 20  >enc);.  .      
188c0 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53  for(; i<pIdx->nS
188d0 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
188e0 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
188f0 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74      int eSamplet
18900 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  ype = aSample[i]
18910 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .eType;.        
18920 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3c  if( eSampletype<
18930 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65  eType ) continue
18940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53  ;.        if( eS
18950 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65  ampletype!=eType
18960 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65   ) break;.#ifnde
18970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
18980 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28 20  F16.        if( 
18990 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49  pColl->enc!=SQLI
189a0 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20  TE_UTF8 ){.     
189b0 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65       int nSample
189c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
189d0 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69   *zSample = sqli
189e0 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20 20  te3Utf8to16(.   
189f0 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70             db, p
18a00 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70  Coll->enc, aSamp
18a10 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70  le[i].u.z, aSamp
18a20 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53  le[i].nByte, &nS
18a30 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20 20  ample.          
18a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18a50 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20   !zSample ){.   
18a60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18a70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18a80 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d );.           
18a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18aa0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
18ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
18ac0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
18ad0 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c  l->pUser, nSampl
18ae0 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a  e, zSample, n, z
18af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18b00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
18b10 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 20  Sample);.       
18b20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
18b30 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
18b40 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
18b50 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
18b60 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
18b70 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
18b80 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
18b90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
18ba0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
18bb0 20 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45 71   if( c==0 ) isEq
18bc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
18bd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
18be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18bf0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
18c00 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
18c10 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
18c20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
18c30 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
18c40 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
18c50 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
18c60 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
18c70 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
18c80 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
18c90 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
18ca0 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
18cb0 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20   isEq==1..  */. 
18cc0 20 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20 20   if( isEq ){.   
18cd0 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
18ce0 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
18cf0 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
18d00 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61  le[i].nLt;.    a
18d10 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
18d20 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73  e[i].nEq;.  }els
18d30 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
18d40 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
18d50 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
18d60 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
18d70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
18d80 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
18d90 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  .nLt;.    }else{
18da0 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
18db0 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
18dc0 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69   ? n : aSample[i
18dd0 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f  ].nLt;.      iLo
18de0 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d  wer = aSample[i-
18df0 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65  1].nEq + aSample
18e00 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d  [i-1].nLt;.    }
18e10 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
18e20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20  pIdx->avgEq;.   
18e30 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
18e40 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
18e50 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
18e60 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
18e70 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
18e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
18e90 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
18ea0 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
18eb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18ec0 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
18ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
18ee0 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
18ef0 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iGap;.  }.  retu
18f00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18f10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18f20 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f  _ENABLE_STAT3 */
18f30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
18f40 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70 72  ssion pExpr repr
18f50 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61 6c  esents a literal
18f60 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70 20   value, set *pp 
18f70 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61  to point to.** a
18f80 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
18f90 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
18fa0 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ning the same va
18fb0 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e 69  lue, with affini
18fc0 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69 65  ty.** aff applie
18fd0 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65 20  d to it, before 
18fe0 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69 73  returning. It is
18ff0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
19000 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ity of the .** c
19010 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
19020 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69 73  lly release this
19030 20 73 74 72 75 63 74 75 72 65 20 62 79 20 70 61   structure by pa
19040 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20  ssing it to .** 
19050 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19060 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
19070 20 63 75 72 72 65 6e 74 20 70 61 72 73 65 20 69   current parse i
19080 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28 73  s a recompile (s
19090 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65 28  qlite3Reprepare(
190a0 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20  )) and pExpr.** 
190b0 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62  is an SQL variab
190c0 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  le that currentl
190d0 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  y has a non-NULL
190e0 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20   value bound to 
190f0 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e  it,.** create an
19100 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
19110 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
19120 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c 20  ing this value, 
19130 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66  again with.** af
19140 66 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c 69  finity aff appli
19150 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65 61  ed to it, instea
19160 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  d..**.** If neit
19170 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76 65  her of the above
19180 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70 20   apply, set *pp 
19190 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
191a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
191b0 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
191c0 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
191d0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
191e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
191f0 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73 74 61  ENABLE_STAT3.sta
19200 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f  tic int valueFro
19210 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  mExpr(.  Parse *
19220 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
19230 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61 66  *pExpr, .  u8 af
19240 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  f, .  sqlite3_va
19250 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66  lue **pp.){.  if
19260 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
19270 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28  VARIABLE.   || (
19280 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
19290 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
192a0 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  >op2==TK_VARIABL
192b0 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  E).  ){.    int 
192c0 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43  iVar = pExpr->iC
192d0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
192e0 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
192f0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
19300 69 56 61 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d  iVar);.    *pp =
19310 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56   sqlite3VdbeGetV
19320 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
19330 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61  prepare, iVar, a
19340 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ff);.    return 
19350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
19360 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
19370 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
19380 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
19390 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
193a0 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  , pp);.}.#endif.
193b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
193c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
193d0 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
193e0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
193f0 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
19400 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
19410 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
19420 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
19430 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
19440 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
19450 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
19460 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
19470 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
19480 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
19490 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
194a0 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
194b0 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
194c0 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
194d0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
194e0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
194f0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
19500 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
19510 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
19520 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
19530 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
19540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19550 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
19560 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195a0 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
195b0 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
195c0 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
195d0 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
195e0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
195f0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
19600 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
19610 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
19620 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
19630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70  .**.** The nEq p
19640 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
19650 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
19660 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
19670 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a   subject to the.
19680 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
19690 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
196a0 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
196b0 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
196c0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74  nstraints.** opt
196d0 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
196e0 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
196f0 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
19700 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
19710 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20   is.** on t1(a, 
19720 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
19730 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
19740 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
19750 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
19760 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
19770 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
19780 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
19790 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61  d the value 1 (a
197a0 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
197b0 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a  ricted column,.*
197c0 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  * b, is the seco
197d0 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  nd left-most col
197e0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
197f0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
19800 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
19810 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
19820 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
19830 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
19840 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
19850 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  assed 0..**.** T
19860 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
19870 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
19880 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63  divisor to reduc
19890 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a  e the estimated.
198a0 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e  ** search space.
198b0 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
198c0 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74   of 1 means that
198d0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
198e0 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c  ts are.** no hel
198f0 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74  p at all.  A ret
19900 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  urn value of 2 m
19910 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74  eans range const
19920 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78  raints are.** ex
19930 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65  pected to reduce
19940 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
19950 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20  e by half.  And 
19960 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a  so forth....**.*
19970 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
19980 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
19990 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65   ANALYZE data, e
199a0 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
199b0 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20  lity.** reduces 
199c0 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
199d0 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
199e0 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  4.  Hence a sing
199f0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
19a00 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
19a10 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20  n a return of 4 
19a20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
19a30 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
19a40 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
19a50 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31  in a return of 1
19a60 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
19a70 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
19a80 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
19a90 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
19aa0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
19ab0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
19ac0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
19ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19ae0 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
19af0 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
19b00 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
19b10 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
19b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
19b30 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
19b40 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
19b50 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
19b60 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
19b70 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
19b80 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
19b90 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
19ba0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
19bb0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
19bc0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
19bd0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
19be0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
19bf0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
19c00 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  L */.  double *p
19c10 52 61 6e 67 65 44 69 76 20 20 20 2f 2a 20 4f 55  RangeDiv   /* OU
19c20 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63 68  T: Reduce search
19c30 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20 64   space by this d
19c40 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  ivisor */.){.  i
19c50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19c60 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
19c70 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 0a  E_ENABLE_STAT3..
19c80 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
19c90 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  p->nSample ){.  
19ca0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
19cb0 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20 20 20  *pRangeVal;.    
19cc0 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d  tRowcnt iLower =
19cd0 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   0;.    tRowcnt 
19ce0 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f  iUpper = p->aiRo
19cf0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f  wEst[0];.    tRo
19d00 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75  wcnt a[2];.    u
19d10 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
19d20 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
19d30 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
19d40 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  ;..    if( pLowe
19d50 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
19d60 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
19d70 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
19d80 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
19d90 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
19da0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
19db0 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20  angeVal);.      
19dc0 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d  assert( (pLower-
19dd0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
19de0 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
19df0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19e00 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
19e10 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74   && whereKeyStat
19e20 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61  s(pParse, p, pRa
19e30 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d 3d 53  ngeVal, 0, a)==S
19e40 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
19e50 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
19e60 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
19e70 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f   if( (pLower->eO
19e80 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
19e90 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b 3d 20  !=0 ) iLower += 
19ea0 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a[1];.      }.  
19eb0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
19ec0 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b  Free(pRangeVal);
19ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
19ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19ef0 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  pUpper ){.      
19f00 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
19f10 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
19f20 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
19f30 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
19f40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
19f50 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  , &pRangeVal);. 
19f60 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 55       assert( (pU
19f70 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
19f80 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
19f90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
19fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
19fb0 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65        && whereKe
19fc0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
19fd0 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c 20  , pRangeVal, 1, 
19fe0 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  a)==SQLITE_OK.  
19ff0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
1a000 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Upper = a[0];.  
1a010 20 20 20 20 20 20 69 66 28 20 28 70 55 70 70 65        if( (pUppe
1a020 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
1a030 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70 70 65  O_LE)!=0 ) iUppe
1a040 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
1a050 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a060 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
1a070 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
1a080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a090 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1a0a0 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72 20 29 7b  Upper<=iLower ){
1a0b0 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
1a0c0 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d  Div = (double)p-
1a0d0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
1a0e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a0f0 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20     *pRangeDiv = 
1a100 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77  (double)p->aiRow
1a110 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c 65 29 28  Est[0]/(double)(
1a120 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
1a130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a140 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22 72  /*WHERETRACE(("r
1a150 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e  ange scan region
1a160 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25  s: %u..%u  div=%
1a170 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
1a180 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
1a190 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
1a1a0 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 2a  , *pRangeDiv));*
1a1b0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1a1c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1a1d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
1a1e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
1a1f0 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
1a200 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
1a210 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1a220 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nEq);.#endif.  a
1a230 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c  ssert( pLower ||
1a240 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52   pUpper );.  *pR
1a250 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c  angeDiv = (doubl
1a260 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  e)1;.  if( pLowe
1a270 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74  r && (pLower->wt
1a280 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1a290 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67 65  LL)==0 ) *pRange
1a2a0 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34  Div *= (double)4
1a2b0 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  ;.  if( pUpper )
1a2c0 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28   *pRangeDiv *= (
1a2d0 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65 74 75  double)4;.  retu
1a2e0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
1a2f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1a300 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
1a310 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1a320 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
1a330 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
1a340 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
1a350 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1a360 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
1a370 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
1a380 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
1a390 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
1a3a0 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
1a3b0 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
1a3c0 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
1a3d0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
1a3e0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
1a3f0 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
1a400 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
1a410 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
1a420 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
1a430 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
1a440 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
1a450 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
1a460 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
1a470 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
1a480 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
1a490 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
1a4a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1a4b0 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
1a4c0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
1a4d0 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
1a4e0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
1a4f0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
1a500 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
1a510 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1a520 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
1a530 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
1a540 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a550 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
1a560 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
1a570 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
1a580 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
1a590 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
1a5a0 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
1a5b0 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
1a5c0 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
1a5d0 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
1a5e0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1a5f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1a600 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
1a610 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
1a620 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1a630 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
1a640 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1a650 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1a660 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1a670 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1a680 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1a690 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
1a6a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1a6b0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1a6c0 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
1a6d0 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
1a6e0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62  traint */.  doub
1a6f0 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  le *pnRow       
1a700 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
1a710 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
1a720 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
1a730 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1a740 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c  Rhs = 0;  /* VAL
1a750 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  UE on right-hand
1a760 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a   side of pTerm *
1a770 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  /.  u8 aff;     
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a790 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
1a7a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
1a7d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a7e0 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
1a7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1a800 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73  tistics */..  as
1a810 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
1a820 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1a830 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
1a840 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
1a850 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
1a860 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
1a870 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  y;.  if( pExpr )
1a880 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  {.    rc = value
1a890 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
1a8a0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
1a8b0 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  hs);.    if( rc 
1a8c0 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
1a8d0 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
1a8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
1a8f0 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  hs = sqlite3Valu
1a900 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29  eNew(pParse->db)
1a910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73  ;.  }.  if( pRhs
1a920 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1a930 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1a940 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  rc = whereKeySta
1a950 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
1a960 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28  hs, 0, a);.  if(
1a970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a980 7b 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41  {.    /*WHERETRA
1a990 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
1a9a0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
1a9b0 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 2a  ", (int)a[1]));*
1a9c0 2f 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61  /.    *pnRow = a
1a9d0 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71  [1];.  }.whereEq
1a9e0 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
1a9f0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  l:.  sqlite3Valu
1aa00 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72  eFree(pRhs);.  r
1aa10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1aa20 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1aa30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1aa40 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  3) */..#ifdef SQ
1aa50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1aa60 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  3./*.** Estimate
1aa70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1aa80 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
1aa90 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
1aaa0 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
1aab0 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
1aac0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1aad0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
1aae0 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
1aaf0 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
1ab00 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
1ab10 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
1ab20 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
1ab30 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
1ab40 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
1ab50 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
1ab60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
1ab70 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
1ab80 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
1ab90 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
1aba0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
1abb0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
1abc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1abd0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
1abe0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
1abf0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
1ac00 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
1ac10 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
1ac20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
1ac30 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
1ac40 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
1ac50 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
1ac60 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
1ac70 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
1ac80 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
1ac90 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
1aca0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
1acb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1acc0 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
1acd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ace0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
1acf0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1ad00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1ad10 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1ad20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1ad30 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63  hose left-most c
1ad40 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a  olumn is pTerm *
1ad50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1ad60 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
1ad70 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
1ad80 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
1ad90 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
1ada0 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f  /.  double *pnRo
1adb0 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  w        /* Writ
1adc0 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
1add0 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
1ade0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1adf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1ae00 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
1ae10 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
1ae20 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45 73 74 3b  /.  double nEst;
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
1ae50 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
1ae60 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  erm */.  double 
1ae70 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f 75 62 6c  nRowEst = (doubl
1ae80 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74 69  e)0; /* New esti
1ae90 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
1aea0 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
1aeb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1aed0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
1aee0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
1aef0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
1af00 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1af10 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
1af20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1af30 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77   nEst = p->aiRow
1af40 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d  Est[0];.    rc =
1af50 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
1af60 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c  st(pParse, p, pL
1af70 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1af80 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
1af90 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
1afa0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1afb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1afc0 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69   nRowEst > p->ai
1afd0 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77  RowEst[0] ) nRow
1afe0 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
1aff0 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  t[0];.    *pnRow
1b000 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
1b010 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22 49  /*WHERETRACE(("I
1b020 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
1b030 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45  est=%g\n", nRowE
1b040 73 74 29 29 3b 2a 2f 0a 20 20 7d 0a 20 20 72 65  st));*/.  }.  re
1b050 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1b060 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
1b070 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1b080 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ) */../*.** Chec
1b090 6b 20 74 6f 20 73 65 65 20 69 66 20 63 6f 6c 75  k to see if colu
1b0a0 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 20 74  mn iCol of the t
1b0b0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
1b0c0 20 69 54 61 62 20 77 69 6c 6c 20 61 70 70 65 61   iTab will appea
1b0d0 72 0a 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f  r.** in sorted o
1b0e0 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
1b0f0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  o the current qu
1b100 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  ery plan..**.** 
1b110 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
1b120 2a 0a 2a 2a 20 20 20 20 30 20 20 20 69 43 6f 6c  *.**    0   iCol
1b130 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 65 64 0a   is not ordered.
1b140 2a 2a 20 20 20 20 31 20 20 20 69 43 6f 6c 20 68  **    1   iCol h
1b150 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  as only a single
1b160 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 32 20 20   value.**    2  
1b170 20 69 43 6f 6c 20 69 73 20 69 6e 20 41 53 43 20   iCol is in ASC 
1b180 6f 72 64 65 72 0a 2a 2a 20 20 20 20 33 20 20 20  order.**    3   
1b190 69 43 6f 6c 20 69 73 20 69 6e 20 44 45 53 43 20  iCol is in DESC 
1b1a0 6f 72 64 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  order.*/.static 
1b1b0 69 6e 74 20 69 73 4f 72 64 65 72 65 64 43 6f 6c  int isOrderedCol
1b1c0 75 6d 6e 28 0a 20 20 57 68 65 72 65 42 65 73 74  umn(.  WhereBest
1b1d0 49 64 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 54  Idx *p,.  int iT
1b1e0 61 62 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 0a 29  ab,.  int iCol.)
1b1f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
1b200 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1b210 65 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  el = &p->aLevel[
1b220 70 2d 3e 69 2d 31 5d 3b 0a 20 20 49 6e 64 65 78  p->i-1];.  Index
1b230 20 2a 70 49 64 78 3b 0a 20 20 75 38 20 73 6f 72   *pIdx;.  u8 sor
1b240 74 4f 72 64 65 72 3b 0a 20 20 66 6f 72 28 69 3d  tOrder;.  for(i=
1b250 70 2d 3e 69 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  p->i-1; i>=0; i-
1b260 2d 2c 20 70 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20  -, pLevel--){.  
1b270 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 54    if( pLevel->iT
1b280 61 62 43 75 72 21 3d 69 54 61 62 20 29 20 63 6f  abCur!=iTab ) co
1b290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1b2a0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1b2b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
1b2c0 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  L_UNIQUE)!=0 ){.
1b2d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b2e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b2f0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
1b300 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b310 4f 52 44 45 52 45 44 29 21 3d 30 20 29 3b 0a 20  ORDERED)!=0 );. 
1b320 20 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 70     if( (pIdx = p
1b330 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
1b340 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
1b350 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
1b360 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1b370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
1b380 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e  tcase( (pLevel->
1b390 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1b3a0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
1b3b0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
1b3c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
1b3d0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
1b3e0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1b3f0 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
1b400 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
1b410 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
1b420 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
1b430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1b440 20 6a 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 30   j>=n ) return 0
1b450 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72  ;.        sortOr
1b460 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
1b470 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1b480 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c     testcase( (pL
1b490 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1b4a0 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
1b4b0 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  SE)!=0 );.      
1b4c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1b4d0 20 20 20 69 66 28 20 69 43 6f 6c 21 3d 28 2d 31     if( iCol!=(-1
1b4e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1b4f0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
1b500 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  0;.      testcas
1b510 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  e( (pLevel->plan
1b520 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1b530 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a  _REVERSE)!=0 );.
1b540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
1b550 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1b560 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
1b570 52 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RSE)!=0 ){.     
1b580 20 61 73 73 65 72 74 28 20 73 6f 72 74 4f 72 64   assert( sortOrd
1b590 65 72 3d 3d 30 20 7c 7c 20 73 6f 72 74 4f 72 64  er==0 || sortOrd
1b5a0 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74  er==1 );.      t
1b5b0 65 73 74 63 61 73 65 28 20 73 6f 72 74 4f 72 64  estcase( sortOrd
1b5c0 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  er==1 );.      s
1b5d0 6f 72 74 4f 72 64 65 72 20 3d 20 31 20 2d 20 73  ortOrder = 1 - s
1b5e0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
1b5f0 20 20 20 20 72 65 74 75 72 6e 20 73 6f 72 74 4f      return sortO
1b600 72 64 65 72 2b 32 3b 0a 20 20 7d 0a 20 20 72 65  rder+2;.  }.  re
1b610 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1b620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
1b630 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61  cides if pIdx ca
1b640 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74  n be used to sat
1b650 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
1b660 59 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 65 69 74  Y.** clause, eit
1b670 68 65 72 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20  her in whole or 
1b680 69 6e 20 70 61 72 74 2e 20 20 54 68 65 20 72 65  in part.  The re
1b690 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1b6a0 65 20 0a 2a 2a 20 63 75 6d 75 6c 61 74 69 76 65  e .** cumulative
1b6b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
1b6c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1b6d0 20 63 6c 61 75 73 65 20 74 68 61 74 20 61 72 65   clause that are
1b6e0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
1b6f0 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20   the index pIdx 
1b700 61 6e 64 20 6f 74 68 65 72 20 69 6e 64 69 63 65  and other indice
1b710 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
1b720 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
1b730 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
1b740 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  has a cursor num
1b750 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20  ber of "base".  
1b760 70 49 64 78 20 69 73 20 74 68 65 0a 2a 2a 20 69  pIdx is the.** i
1b770 6e 64 65 78 20 74 68 61 74 20 69 73 20 70 6f 73  ndex that is pos
1b780 74 75 6c 61 74 65 64 20 66 6f 72 20 75 73 65 20  tulated for use 
1b790 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
1b7a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a  ble..**.** The *
1b7b0 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 20 73  pbRev value is s
1b7c0 65 74 20 74 6f 20 30 20 6f 72 64 65 72 20 31 20  et to 0 order 1 
1b7d0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1b7e0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70  ther or not.** p
1b7f0 49 64 78 20 73 68 6f 75 6c 64 20 62 65 20 72 75  Idx should be ru
1b800 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64  n in the forward
1b810 20 6f 72 64 65 72 20 6f 72 20 69 6e 20 72 65 76   order or in rev
1b820 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
1b830 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74  tatic int isSort
1b840 69 6e 67 49 6e 64 65 78 28 0a 20 20 57 68 65 72  ingIndex(.  Wher
1b850 65 42 65 73 74 49 64 78 20 2a 70 2c 20 20 20 20  eBestIdx *p,    
1b860 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 73 65  /* Best index se
1b870 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arch context */.
1b880 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1b890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1b8a0 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
1b8b0 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
1b8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1b8d0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1b8e0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
1b8f0 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sorted */.  int 
1b900 2a 70 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  *pbRev,         
1b910 2f 2a 20 53 65 74 20 74 6f 20 31 20 66 6f 72 20  /* Set to 1 for 
1b920 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
1b930 61 6e 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  an of pIdx */.  
1b940 69 6e 74 20 2a 70 62 4f 62 55 6e 69 71 75 65 20  int *pbObUnique 
1b950 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
1b960 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 77 69  column values wi
1b970 6c 6c 20 64 69 66 66 65 72 65 6e 74 20 69 6e 20  ll different in 
1b980 65 76 65 72 79 20 72 6f 77 20 2a 2f 0a 29 7b 0a  every row */.){.
1b990 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 49 64  /* Number of pId
1b9c0 78 20 74 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a  x terms used */.
1b9d0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
1ba00 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1ba10 73 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  sfied */.  int s
1ba20 6f 72 74 4f 72 64 65 72 20 3d 20 32 3b 20 20 20  ortOrder = 2;   
1ba30 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 66           /* 0: f
1ba40 6f 72 77 61 72 64 2e 20 20 31 3a 20 62 61 63 6b  orward.  1: back
1ba50 77 61 72 64 2e 20 20 32 3a 20 75 6e 6b 6e 6f 77  ward.  2: unknow
1ba60 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  n */.  int nTerm
1ba70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ba90 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
1baa0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
1bab0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 42 49  rList_item *pOBI
1bac0 74 65 6d 3b 2f 2a 20 41 20 74 65 72 6d 20 6f 66  tem;/* A term of
1bad0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bae0 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
1baf0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
1bb00 61 62 6c 65 3b 20 20 20 2f 2a 20 54 61 62 6c 65  able;   /* Table
1bb10 20 74 68 61 74 20 6f 77 6e 73 20 69 6e 64 65 78   that owns index
1bb20 20 70 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 4c   pIdx */.  ExprL
1bb30 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1bb50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bb60 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1bb70 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20  se = p->pParse; 
1bb80 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
1bb90 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
1bba0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1bbb0 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
1bbc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1bbd0 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 53 61  /.  int nPriorSa
1bbe0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1bbf0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
1bc00 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
1bc10 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   outer loops */.
1bc20 20 20 69 6e 74 20 73 65 65 6e 52 6f 77 69 64 20    int seenRowid 
1bc30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1bc40 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 4f 52  /* True if an OR
1bc50 44 45 52 20 42 59 20 72 6f 77 69 64 20 74 65 72  DER BY rowid ter
1bc60 6d 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  m is seen */.  i
1bc70 6e 74 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c  nt uniqueNotNull
1bc80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bc90 70 49 64 78 20 69 73 20 55 4e 49 51 55 45 20 77  pIdx is UNIQUE w
1bca0 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  ith all terms ar
1bcb0 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e NOT NULL */.  
1bcc0 69 6e 74 20 6f 75 74 65 72 4f 62 55 6e 69 71 75  int outerObUniqu
1bcd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1bce0 20 4f 75 74 65 72 20 6c 6f 6f 70 73 20 67 65 6e   Outer loops gen
1bcf0 65 72 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  erate different 
1bd00 76 61 6c 75 65 73 20 69 6e 0a 20 20 20 20 20 20  values in.      
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 76 65            ** eve
1bd30 72 79 20 72 6f 77 20 66 6f 72 20 74 68 65 20 4f  ry row for the O
1bd40 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 20  RDER BY columns 
1bd50 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 69 3d 3d  */..  if( p->i==
1bd60 30 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53  0 ){.    nPriorS
1bd70 61 74 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 65  at = 0;.    oute
1bd80 72 4f 62 55 6e 69 71 75 65 20 3d 20 31 3b 0a 20  rObUnique = 1;. 
1bd90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20   }else{.    u32 
1bda0 77 73 46 6c 61 67 73 20 3d 20 70 2d 3e 61 4c 65  wsFlags = p->aLe
1bdb0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
1bdc0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 6e 50  .wsFlags;.    nP
1bdd0 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65  riorSat = p->aLe
1bde0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
1bdf0 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 69 66 28  .nOBSat;.    if(
1be00 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
1be10 45 5f 4f 52 44 45 52 45 44 29 3d 3d 30 20 29 7b  E_ORDERED)==0 ){
1be20 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c  .      /* This l
1be30 6f 6f 70 20 63 61 6e 6e 6f 74 20 62 65 20 6f 72  oop cannot be or
1be40 64 65 72 65 64 20 75 6e 6c 65 73 73 20 74 68 65  dered unless the
1be50 20 6e 65 78 74 20 6f 75 74 65 72 20 6c 6f 6f 70   next outer loop
1be60 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73   is.      ** als
1be70 6f 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  o ordered */.   
1be80 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72     return nPrior
1be90 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Sat;.    }.    i
1bea0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1beb0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1bec0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1bed0 6e 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  n) ){.      /* O
1bee0 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20  nly look at the 
1bef0 6f 75 74 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20  outer-most loop 
1bf00 69 66 20 74 68 65 20 4f 72 64 65 72 42 79 49 64  if the OrderById
1bf10 78 4a 6f 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  xJoin.      ** o
1bf20 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64  ptimization is d
1bf30 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 20  isabled */.     
1bf40 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61   return nPriorSa
1bf50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
1bf60 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
1bf70 20 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51 55 45   WHERE_OB_UNIQUE
1bf80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1bf90 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
1bfa0 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 29 3b 0a  E_ALL_UNIQUE );.
1bfb0 20 20 20 20 6f 75 74 65 72 4f 62 55 6e 69 71 75      outerObUniqu
1bfc0 65 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 28  e = (wsFlags & (
1bfd0 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51 55 45 7c  WHERE_OB_UNIQUE|
1bfe0 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
1bff0 29 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 4f 72  ))!=0;.  }.  pOr
1c000 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1c010 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
1c020 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1c030 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
1c040 65 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 48  ered ){.    /* H
1c050 61 73 68 20 69 6e 64 69 63 65 73 20 28 69 6e 64  ash indices (ind
1c060 69 63 61 74 65 64 20 62 79 20 74 68 65 20 22 75  icated by the "u
1c070 6e 6f 72 64 65 72 65 64 22 20 74 61 67 20 6f 6e  nordered" tag on
1c080 20 73 71 6c 69 74 65 5f 73 74 61 74 31 29 20 63   sqlite_stat1) c
1c090 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20  annot.    ** be 
1c0a0 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
1c0b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   */.    return n
1c0c0 50 72 69 6f 72 53 61 74 3b 0a 20 20 7d 0a 20 20  PriorSat;.  }.  
1c0d0 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  nTerm = pOrderBy
1c0e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 75 6e 69 71 75  ->nExpr;.  uniqu
1c0f0 65 4e 6f 74 4e 75 6c 6c 20 3d 20 70 49 64 78 2d  eNotNull = pIdx-
1c100 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1c110 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  e;.  assert( nTe
1c120 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72  rm>0 );..  /* Ar
1c130 67 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74  gument pIdx must
1c140 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f   either point to
1c150 20 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20   a 'real' named 
1c160 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2c  index structure,
1c170 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64   .  ** or an ind
1c180 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ex structure all
1c190 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74  ocated on the st
1c1a0 61 63 6b 20 62 79 20 62 65 73 74 42 74 72 65 65  ack by bestBtree
1c1b0 49 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20  Index() to.  ** 
1c1c0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
1c1d0 77 69 64 20 69 6e 64 65 78 20 74 68 61 74 20 69  wid index that i
1c1e0 73 20 70 61 72 74 20 6f 66 20 65 76 65 72 79 20  s part of every 
1c1f0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  table.  */.  ass
1c200 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ert( pIdx->zName
1c210 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   || (pIdx->nColu
1c220 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61  mn==1 && pIdx->a
1c230 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20  iColumn[0]==-1) 
1c240 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
1c250 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1c260 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
1c270 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
1c280 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
1c290 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
1c2a0 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  at indices have 
1c2b0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65  pIdx->nColumn re
1c2c0 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c  gular columns pl
1c2d0 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69  us.  ** one addi
1c2e0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f  tional column co
1c2f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
1c300 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63  id.  The rowid c
1c310 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68  olumn.  ** of th
1c320 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20  e index is also 
1c330 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
1c340 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44   against the ORD
1c350 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
1c360 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 6e 50  e..  */.  j = nP
1c370 72 69 6f 72 53 61 74 3b 0a 20 20 66 6f 72 28 69  riorSat;.  for(i
1c380 3d 30 2c 70 4f 42 49 74 65 6d 3d 26 70 4f 72 64  =0,pOBItem=&pOrd
1c390 65 72 42 79 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54  erBy->a[j]; j<nT
1c3a0 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
1c3b0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1c3c0 20 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72     Expr *pOBExpr
1c3d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1c3e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
1c3f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 4f 42  the ORDER BY pOB
1c400 49 74 65 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Item */.    Coll
1c410 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
1c420 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1c430 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  ting sequence of
1c440 20 70 4f 42 45 78 70 72 20 2a 2f 0a 20 20 20 20   pOBExpr */.    
1c450 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  int termSortOrde
1c460 72 3b 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  r;      /* Sort 
1c470 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
1c480 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
1c490 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1c4a0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
1c4b0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1c4c0 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69  ex.  -1 for rowi
1c4d0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f  d */.    int iSo
1c4e0 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rtOrder;        
1c4f0 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20   /* 1 for DESC, 
1c500 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65  0 for ASC on the
1c510 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d   i-th index term
1c520 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 45 71   */.    int isEq
1c530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c540 2f 2a 20 53 75 62 6a 65 63 74 20 74 6f 20 61 6e  /* Subject to an
1c550 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c 4c 20 63   == or IS NULL c
1c560 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1c570 20 69 6e 74 20 69 73 4d 61 74 63 68 3b 20 20 20   int isMatch;   
1c580 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
1c590 52 20 42 59 20 74 65 72 6d 20 6d 61 74 63 68 65  R BY term matche
1c5a0 73 20 74 68 65 20 69 6e 64 65 78 20 74 65 72 6d  s the index term
1c5b0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1c5c0 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1c5d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
1c5e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
1c5f0 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72  r i-th index ter
1c600 6d 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  m */.    WhereTe
1c610 72 6d 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b  rm *pConstraint;
1c620 20 2f 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74   /* A constraint
1c630 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1c640 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ause */..    /* 
1c650 49 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  If the next term
1c660 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c670 20 63 6c 61 75 73 65 20 72 65 66 65 72 73 20 74   clause refers t
1c680 6f 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  o anything other
1c690 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 61 20 63   than.    ** a c
1c6a0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 22 62 61  olumn in the "ba
1c6b0 73 65 22 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  se" table, then 
1c6c0 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20  this index will 
1c6d0 6e 6f 74 20 62 65 20 6f 66 20 61 6e 79 0a 20 20  not be of any.  
1c6e0 20 20 2a 2a 20 66 75 72 74 68 65 72 20 75 73 65    ** further use
1c6f0 20 69 6e 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   in handling the
1c700 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20   ORDER BY. */.  
1c710 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
1c720 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c730 74 65 28 70 4f 42 49 74 65 6d 2d 3e 70 45 78 70  te(pOBItem->pExp
1c740 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 42 45  r);.    if( pOBE
1c750 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1c760 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72 2d 3e 69  MN || pOBExpr->i
1c770 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
1c780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c790 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 63  }..    /* Find c
1c7a0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
1c7b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c7c0 6e 63 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74  nce for the next
1c7d0 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 69 6e   entry.    ** in
1c7e0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1c7f0 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
1c800 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  e && i<pIdx->nCo
1c810 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
1c820 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
1c830 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
1c840 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
1c850 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
1c860 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
1c870 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
1c880 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
1c890 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
1c8a0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
1c8b0 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
1c8c0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
1c8d0 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
1c8e0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
1c8f0 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
1c900 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72  1;.      iSortOr
1c910 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  der = 0;.      z
1c920 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Coll = 0;.    }.
1c930 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1c940 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
1c950 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f  mn number and co
1c960 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c970 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69   of the.    ** i
1c980 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63  ndex match the c
1c990 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
1c9a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c9b0 6e 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  nce of the ORDER
1c9c0 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
1c9d0 65 20 65 6e 74 72 79 2e 20 20 53 65 74 20 69 73  e entry.  Set is
1c9e0 4d 61 74 63 68 20 74 6f 20 31 20 69 66 20 74 68  Match to 1 if th
1c9f0 65 79 20 62 6f 74 68 20 6d 61 74 63 68 2e 20 2a  ey both match. *
1ca00 2f 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78 70  /.    if( pOBExp
1ca10 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  r->iColumn==iCol
1ca20 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  umn ){.      if(
1ca30 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   zColl ){.      
1ca40 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1ca50 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ca60 72 73 65 2c 20 70 4f 42 49 74 65 6d 2d 3e 70 45  rse, pOBItem->pE
1ca70 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1ca80 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
1ca90 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
1caa0 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
1cab0 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 49 43  h = sqlite3StrIC
1cac0 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
1cad0 20 7a 43 6f 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20   zColl)==0;.    
1cae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1caf0 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
1cb00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1cb10 0a 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d  .      isMatch =
1cb20 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
1cb30 2a 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20  * termSortOrder 
1cb40 69 73 20 30 20 6f 72 20 31 20 66 6f 72 20 77 68  is 0 or 1 for wh
1cb50 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1cb60 20 61 63 63 65 73 73 20 6c 6f 6f 70 20 73 68 6f   access loop sho
1cb70 75 6c 64 0a 20 20 20 20 2a 2a 20 72 75 6e 20 66  uld.    ** run f
1cb80 6f 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77 61  orward or backwa
1cb90 72 64 73 20 28 72 65 73 70 65 63 74 69 76 65 6c  rds (respectivel
1cba0 79 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  y) in order to s
1cbb0 61 74 69 73 66 79 20 74 68 69 73 20 0a 20 20 20  atisfy this .   
1cbc0 20 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20   ** term of the 
1cbd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1cbe0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1cbf0 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  pOBItem->sortOrd
1cc00 65 72 3d 3d 30 20 7c 7c 20 70 4f 42 49 74 65 6d  er==0 || pOBItem
1cc10 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
1cc20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
1cc30 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
1cc40 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
1cc50 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
1cc60 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
1cc70 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   pOBItem->sortOr
1cc80 64 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  der;..    /* If 
1cc90 58 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  X is the column 
1cca0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  in the index and
1ccb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ccc0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 0a 20  , check to see. 
1ccd0 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61     ** if there a
1cce0 72 65 20 61 6e 79 20 58 3d 20 6f 72 20 58 20 49  re any X= or X I
1ccf0 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  S NULL constrain
1cd00 74 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ts in the WHERE 
1cd10 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 70  clause. */.    p
1cd20 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 66 69 6e  Constraint = fin
1cd30 64 54 65 72 6d 28 70 2d 3e 70 57 43 2c 20 62 61  dTerm(p->pWC, ba
1cd40 73 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e  se, iColumn, p->
1cd50 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49 53       WO_EQ|WO_IS
1cd80 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c 20 70 49 64 78  NULL|WO_IN, pIdx
1cd90 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  );.    if( pCons
1cda0 74 72 61 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  traint==0 ){.   
1cdb0 20 20 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 20     isEq = 0;.   
1cdc0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 43 6f 6e   }else if( (pCon
1cdd0 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61 74  straint->eOperat
1cde0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
1cdf0 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20 30  {.      isEq = 0
1ce00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ce10 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65 4f  (pConstraint->eO
1ce20 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
1ce30 55 4c 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)!=0 ){.     
1ce40 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1ce50 20 30 3b 0a 20 20 20 20 20 20 69 73 45 71 20 3d   0;.      isEq =
1ce60 20 31 3b 20 20 2f 2a 20 22 58 20 49 53 20 4e 55   1;  /* "X IS NU
1ce70 4c 4c 22 20 6d 65 61 6e 73 20 58 20 68 61 73 20  LL" means X has 
1ce80 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61  only a single va
1ce90 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  lue */.    }else
1cea0 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1ceb0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
1cec0 20 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d   ){.      isEq =
1ced0 20 31 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69   1;  /* Constrai
1cee0 6e 74 20 22 58 3d 63 6f 6e 73 74 61 6e 74 22 20  nt "X=constant" 
1cef0 6d 65 61 6e 73 20 58 20 68 61 73 20 6f 6e 6c 79  means X has only
1cf00 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
1cf10 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1cf20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1cf30 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
1cf40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1cf50 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1cf60 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1cf70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 57 48 45 52  {.        /*WHER
1cf80 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20 20  ETRACE(("       
1cf90 2e 2e 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75  .. isOrderedColu
1cfa0 6d 6e 28 74 61 62 3d 25 64 2c 63 6f 6c 3d 25 64  mn(tab=%d,col=%d
1cfb0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
1cfc0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
1cfd0 69 54 61 62 6c 65 2c 20 70 52 69 67 68 74 2d 3e  iTable, pRight->
1cfe0 69 43 6f 6c 75 6d 6e 29 29 3b 2a 2f 0a 20 20 20  iColumn));*/.   
1cff0 20 20 20 20 20 69 73 45 71 20 3d 20 69 73 4f 72       isEq = isOr
1d000 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70 2c 20 70  deredColumn(p, p
1d010 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70  Right->iTable, p
1d020 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  Right->iColumn);
1d030 0a 20 20 20 20 20 20 20 20 2f 2a 57 48 45 52 45  .        /*WHERE
1d040 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45 71  TRACE((" -> isEq
1d050 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b 2a  =%d\n", isEq));*
1d060 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  /..        /* If
1d070 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1d080 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  is of the form X
1d090 3d 59 20 77 68 65 72 65 20 59 20 69 73 20 61 6e  =Y where Y is an
1d0a0 20 6f 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20   ordered value. 
1d0b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20         ** in an 
1d0c0 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e  outer loop, then
1d0d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1d0e0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d  ort order of Y m
1d0f0 61 74 63 68 65 73 20 74 68 65 0a 20 20 20 20 20  atches the.     
1d100 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1d110 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e   required for X.
1d120 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d130 69 73 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e  isMatch && isEq>
1d140 3d 32 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49  =2 && isEq!=pOBI
1d150 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32  tem->sortOrder+2
1d160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1d170 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20  stcase( isEq==2 
1d180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
1d190 74 63 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29  tcase( isEq==3 )
1d1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1d1b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d1c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d1d0 20 20 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20    isEq = 0;  /* 
1d1e0 22 58 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20  "X=expr" places 
1d1f0 6e 6f 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73  no ordering cons
1d200 74 72 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a  traints on X */.
1d210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d220 20 20 69 66 28 20 21 69 73 4d 61 74 63 68 20 29    if( !isMatch )
1d230 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 71  {.      if( isEq
1d240 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
1d250 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
1d260 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  e{.        conti
1d270 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1d280 20 7d 65 6c 73 65 20 69 66 28 20 69 73 45 71 21   }else if( isEq!
1d290 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
1d2a0 73 6f 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a  sortOrder==2 ){.
1d2b0 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65          sortOrde
1d2c0 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  r = termSortOrde
1d2d0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
1d2e0 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
1d2f0 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
1d300 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d320 6a 2b 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d  j++;.    pOBItem
1d330 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
1d340 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  umn<0 ){.      s
1d350 65 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  eenRowid = 1;.  
1d360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d370 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
1d380 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
1d390 4e 75 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21  Null==0 && isEq!
1d3a0 3d 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =1 ){.      test
1d3b0 63 61 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b  case( isEq==0 );
1d3c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d3d0 20 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20   isEq==2 );.    
1d3e0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71    testcase( isEq
1d3f0 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69  ==3 );.      uni
1d400 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  queNotNull = 0;.
1d410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1d420 73 65 65 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20  seenRowid ){.   
1d430 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1d440 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1d450 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30  uniqueNotNull==0
1d460 20 7c 7c 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   || i<pIdx->nCol
1d470 75 6d 6e 20 29 7b 0a 20 20 20 20 75 6e 69 71 75  umn ){.    uniqu
1d480 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  eNotNull = 0;.  
1d490 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  }..  /* If we ha
1d4a0 76 65 20 6e 6f 74 20 66 6f 75 6e 64 20 61 74 20  ve not found at 
1d4b0 6c 65 61 73 74 20 6f 6e 65 20 4f 52 44 45 52 20  least one ORDER 
1d4c0 42 59 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74  BY term that mat
1d4d0 63 68 65 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ches the.  ** in
1d4e0 64 65 78 2c 20 74 68 65 6e 20 73 68 6f 77 20 6e  dex, then show n
1d4f0 6f 20 70 72 6f 67 72 65 73 73 2e 20 2a 2f 0a 20  o progress. */. 
1d500 20 69 66 28 20 70 4f 42 49 74 65 6d 3d 3d 26 70   if( pOBItem==&p
1d510 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 50 72 69 6f  OrderBy->a[nPrio
1d520 72 53 61 74 5d 20 29 20 72 65 74 75 72 6e 20 6e  rSat] ) return n
1d530 50 72 69 6f 72 53 61 74 3b 0a 0a 20 20 2f 2a 20  PriorSat;..  /* 
1d540 45 69 74 68 65 72 20 74 68 65 20 6f 75 74 65 72  Either the outer
1d550 20 71 75 65 72 69 65 73 20 6d 75 73 74 20 67 65   queries must ge
1d560 6e 65 72 61 74 65 20 72 6f 77 73 20 77 68 65 72  nerate rows wher
1d570 65 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  e there are no t
1d580 77 6f 0a 20 20 2a 2a 20 72 6f 77 73 20 77 69 74  wo.  ** rows wit
1d590 68 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  h the same value
1d5a0 73 20 69 6e 20 61 6c 6c 20 4f 52 44 45 52 20 42  s in all ORDER B
1d5b0 59 20 63 6f 6c 75 6d 6e 73 2c 20 6f 72 20 65 6c  Y columns, or el
1d5c0 73 65 20 74 68 69 73 0a 20 20 2a 2a 20 6c 6f 6f  se this.  ** loo
1d5d0 70 20 6d 75 73 74 20 67 65 6e 65 72 61 74 65 20  p must generate 
1d5e0 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f  just a single ro
1d5f0 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 45 78  w of output.  Ex
1d600 61 6d 70 6c 65 3a 20 20 53 75 70 70 6f 73 65 0a  ample:  Suppose.
1d610 20 20 2a 2a 20 74 68 65 20 6f 75 74 65 72 20 6c    ** the outer l
1d620 6f 6f 70 73 20 67 65 6e 65 72 61 74 65 20 41 3d  oops generate A=
1d630 31 20 61 6e 64 20 41 3d 31 2c 20 61 6e 64 20 74  1 and A=1, and t
1d640 68 69 73 20 6c 6f 6f 70 20 67 65 6e 65 72 61 74  his loop generat
1d650 65 73 20 42 3d 33 0a 20 20 2a 2a 20 61 6e 64 20  es B=3.  ** and 
1d660 42 3d 34 2e 20 20 54 68 65 6e 20 77 69 74 68 6f  B=4.  Then witho
1d670 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
1d680 20 74 65 73 74 2c 20 4f 52 44 45 52 20 42 59 20   test, ORDER BY 
1d690 41 2c 42 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  A,B would .  ** 
1d6a0 67 65 6e 65 72 61 74 65 20 74 68 65 20 77 72 6f  generate the wro
1d6b0 6e 67 20 6f 72 64 65 72 20 6f 75 74 70 75 74 3a  ng order output:
1d6c0 20 31 2c 33 20 31 2c 34 20 31 2c 33 20 31 2c 34   1,3 1,4 1,3 1,4
1d6d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 75 74 65  .  */.  if( oute
1d6e0 72 4f 62 55 6e 69 71 75 65 3d 3d 30 20 26 26 20  rObUnique==0 && 
1d6f0 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30  uniqueNotNull==0
1d700 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72   ) return nPrior
1d710 53 61 74 3b 0a 20 20 2a 70 62 4f 62 55 6e 69 71  Sat;.  *pbObUniq
1d720 75 65 20 3d 20 75 6e 69 71 75 65 4e 6f 74 4e 75  ue = uniqueNotNu
1d730 6c 6c 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  ll;..  /* Return
1d740 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 73   the necessary s
1d750 63 61 6e 20 6f 72 64 65 72 20 62 61 63 6b 20 74  can order back t
1d760 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  o the caller */.
1d770 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
1d780 72 64 65 72 20 26 20 31 3b 0a 0a 20 20 2f 2a 20  rder & 1;..  /* 
1d790 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
1d7a0 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22  "ORDER BY rowid"
1d7b0 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68   term that match
1d7c0 65 64 2c 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c  ed, or it is onl
1d7d0 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
1d7e0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  for a single row
1d7f0 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
1d800 20 74 6f 20 6d 61 74 63 68 2c 20 74 68 65 6e 20   to match, then 
1d810 73 6b 69 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61  skip over.  ** a
1d820 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52  ny additional OR
1d830 44 45 52 20 42 59 20 74 65 72 6d 73 20 64 65 61  DER BY terms dea
1d840 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 20 74  ling with this t
1d850 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1d860 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 29   uniqueNotNull )
1d870 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  {.    /* Advance
1d880 20 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e   j over addition
1d890 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  al ORDER BY term
1d8a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1d8b0 68 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68  h base */.    Wh
1d8c0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20  ereMaskSet *pMS 
1d8d0 3d 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53  = p->pWC->pMaskS
1d8e0 65 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  et;.    Bitmask 
1d8f0 6d 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53  m = ~getMask(pMS
1d900 2c 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69  , base);.    whi
1d910 6c 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28  le( j<nTerm && (
1d920 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
1d930 4d 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  MS, pOrderBy->a[
1d940 6a 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20  j].pExpr)&m)==0 
1d950 29 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ){.      j++;.  
1d960 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d970 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
1d980 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79  d the best query
1d990 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1d9a0 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1d9b0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
1d9c0 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
1d9d0 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
1d9e0 73 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63  st into the p->c
1d9f0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ost..**.** The l
1da00 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20  owest cost plan 
1da10 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
1da20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1da30 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
1da40 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
1da50 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72  I/O needed to pr
1da60 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
1da70 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46  ted result..** F
1da80 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
1da90 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
1daa0 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
1dab0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
1dac0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
1dad0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
1dae0 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
1daf0 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
1db00 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
1db10 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
1db20 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
1db30 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
1db40 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1db50 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
1db60 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
1db70 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
1db80 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
1db90 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
1dba0 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
1dbb0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1dbc0 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64  ause (pSrc->pInd
1dbd0 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20  ex) attached to 
1dbe0 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  the table in.** 
1dbf0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1dc00 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
1dc10 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69  ction only consi
1dc20 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67  ders plans using
1dc30 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69   the .** named i
1dc40 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68  ndex. If no such
1dc50 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20   plan is found, 
1dc60 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
1dc70 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
1dc80 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
1dc90 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20  a plan is found 
1dca0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
1dcb0 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
1dcc0 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
1dcd0 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
1dce0 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
1dcf0 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
1dd00 58 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61  XED clause was a
1dd10 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
1dd20 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
1dd30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1dd40 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
1dd50 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1dd60 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
1dd70 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
1dd80 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
1dd90 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
1dda0 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20   built-in rowid 
1ddb0 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69  primary key.** i
1ddc0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1ddd0 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
1dde0 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
1ddf0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1de00 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
1de10 65 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e;  /* The parsi
1de20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1de30 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1de40 20 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54   = p->pWC;  /* T
1de50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1de60 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1de70 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1de80 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65   p->pSrc; /* The
1de90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1dea0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1deb0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1dec0 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
1ded0 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
1dee0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
1def0 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
1df00 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
1df10 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1df20 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
1df30 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
1df40 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1df50 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1df60 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
1df70 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
1df80 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
1df90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1dfa0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
1dfb0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1dfc0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1dfd0 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
1dfe0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1dff0 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
1e000 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1e010 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
1e020 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
1e030 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
1e040 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
1e050 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
1e060 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
1e070 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
1e080 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
1e090 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
1e0a0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1e0b0 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
1e0c0 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
1e0d0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
1e0e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1e0f0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1e100 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
1e110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1e120 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d  owed flags in p-
1e130 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
1e140 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f  g */.  int nPrio
1e150 72 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  rSat;           
1e160 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74     /* ORDER BY t
1e170 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
1e180 79 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f  y outer loops */
1e190 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
1e1c0 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
1e1d0 63 68 61 72 20 62 53 6f 72 74 49 6e 69 74 3b 20  char bSortInit; 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e1f0 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62  nitializer for b
1e200 53 6f 72 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f  Sort in inner lo
1e210 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 62 44 69  op */.  char bDi
1e220 73 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  stInit;         
1e230 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1e240 65 72 20 66 6f 72 20 62 44 69 73 74 20 69 6e 20  er for bDist in 
1e250 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a  inner loop */...
1e260 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1e270 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f  the cost to a wo
1e280 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a  rst-case value *
1e290 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63  /.  memset(&p->c
1e2a0 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ost, 0, sizeof(p
1e2b0 2d 3e 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63  ->cost));.  p->c
1e2c0 6f 73 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  ost.rCost = SQLI
1e2d0 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
1e2e0 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
1e2f0 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
1e300 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1e310 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
1e320 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
1e330 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
1e340 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
1e350 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
1e360 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
1e370 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
1e380 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
1e390 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
1e3a0 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
1e3b0 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
1e3c0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
1e3d0 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
1e3e0 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
1e3f0 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
1e400 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
1e410 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20   pSrc->jointype 
1e420 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
1e430 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1e440 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
1e450 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71  }else{.    idxEq
1e460 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
1e470 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1e480 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72  ;.  }..  if( pSr
1e490 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
1e4a0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
1e4b0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
1e4c0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1e4d0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
1e4e0 20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62      pIdx = pProb
1e4f0 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
1e500 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
1e510 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
1e520 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1e530 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
1e540 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
1e550 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b  rmMask;.  }else{
1e560 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
1e570 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
1e580 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
1e590 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
1e5a0 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
1e5b0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
1e5c0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
1e5d0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
1e5e0 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
1e5f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
1e600 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
1e610 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
1e620 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
1e630 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
1e640 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
1e650 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
1e660 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
1e690 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
1e6a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
1e6b0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
1e6c0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
1e6d0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
1e6e0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
1e6f0 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
1e700 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
1e710 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
1e720 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
1e730 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
1e740 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
1e750 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
1e760 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
1e770 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
1e780 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
1e790 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
1e7a0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
1e7b0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
1e7c0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
1e7d0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
1e7e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
1e7f0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
1e800 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
1e810 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
1e820 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
1e830 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
1e840 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
1e850 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1e860 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
1e870 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
1e880 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
1e890 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d  sPk;.    wsFlagM
1e8a0 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20  ask = ~(.       
1e8b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1e8c0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1e8d0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
1e8e0 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LL|WHERE_COLUMN_
1e8f0 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20  RANGE.    );.   
1e900 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
1e910 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70  _EQ|WO_IN;.    p
1e920 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Idx = 0;.  }..  
1e930 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
1e940 72 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64  rderBy ? p->pOrd
1e950 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  erBy->nExpr : 0;
1e960 0a 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a 20  .  if( p->i ){. 
1e970 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70     nPriorSat = p
1e980 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1e990 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20  .plan.nOBSat;.  
1e9a0 20 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 50    bSortInit = nP
1e9b0 72 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72 42 79  riorSat<nOrderBy
1e9c0 3b 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20  ;.    bDistInit 
1e9d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1e9e0 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b    nPriorSat = 0;
1e9f0 0a 20 20 20 20 62 53 6f 72 74 49 6e 69 74 20 3d  .    bSortInit =
1ea00 20 6e 4f 72 64 65 72 42 79 3e 30 3b 0a 20 20 20   nOrderBy>0;.   
1ea10 20 62 44 69 73 74 49 6e 69 74 20 3d 20 70 2d 3e   bDistInit = p->
1ea20 70 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20 20  pDistinct!=0;.  
1ea30 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
1ea40 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f  r all indices lo
1ea50 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oking for the be
1ea60 73 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20  st one to use.  
1ea70 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
1ea80 65 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70  e; pIdx=pProbe=p
1ea90 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
1eaa0 20 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74     const tRowcnt
1eab0 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73   * const aiRowEs
1eac0 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
1ead0 77 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65 43  wEst;.    WhereC
1eae0 6f 73 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  ost pc;         
1eaf0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
1eb00 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
1eb10 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31  .    double log1
1eb20 30 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20  0N = (double)1; 
1eb30 20 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61   /* base-10 loga
1eb40 72 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69  rithm of nRow (i
1eb50 6e 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20 20  nexact) */..    
1eb60 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1eb70 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70   variables are p
1eb80 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  opulated based o
1eb90 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73  n the properties
1eba0 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   of.    ** index
1ebb0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1ebc0 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20  . They are then 
1ebd0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
1ebe0 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20  e the expected. 
1ebf0 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e     ** cost and n
1ec00 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
1ec10 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  turned..    **. 
1ec20 20 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e     **  pc.plan.n
1ec30 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e  Eq: .    **    N
1ec40 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
1ec50 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e  y terms that can
1ec60 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
1ec70 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e  using the index.
1ec80 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74  .    **    In ot
1ec90 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e  her words, the n
1eca0 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c  umber of initial
1ecb0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69   fields in the i
1ecc0 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a  ndex that.    **
1ecd0 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20      are used in 
1ece0 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20  == or IN or NOT 
1ecf0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
1ed00 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1ed10 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ause..    **.   
1ed20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20   **  nInMul:  . 
1ed30 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e     **    The "in
1ed40 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68  -multiplier". Th
1ed50 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  is is an estimat
1ed60 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65  e of how many se
1ed70 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20  ek operations . 
1ed80 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
1ed90 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20  must perform on 
1eda0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65  the index in que
1edb0 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70  stion. For examp
1edc0 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1edd0 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75  **    WHERE clau
1ede0 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  se is:.    **.  
1edf0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1ee00 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41  a IN (1, 2, 3) A
1ee10 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36  ND b IN (4, 5, 6
1ee20 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1ee30 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70     SQLite must p
1ee40 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73  erform 9 lookups
1ee50 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   on an index on 
1ee60 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75  (a, b), so nInMu
1ee70 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20  l is .    **    
1ee80 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20  set to 9. Given 
1ee90 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20  the same schema 
1eea0 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68  and either of th
1eeb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52  e following WHER
1eec0 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61  E .    **    cla
1eed0 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  uses:.    **.   
1eee0 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1eef0 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20   =  1.    **    
1ef00 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20    WHERE a >= 2. 
1ef10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ef20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f  nInMul is set to
1ef30 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   1..    **.    *
1ef40 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78  *    If there ex
1ef50 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72  ists a WHERE ter
1ef60 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  m of the form "x
1ef70 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
1ef80 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ", then .    ** 
1ef90 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63     the sub-selec
1efa0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
1efb0 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66  return 25 rows f
1efc0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
1efd0 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65  of .    **    de
1efe0 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c  termining nInMul
1eff0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f000 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a   bInEst:  .    *
1f010 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65  *    Set to true
1f020 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74   if there was at
1f030 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e   least one "x IN
1f040 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74   (SELECT ...)" t
1f050 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a  erm used .    **
1f060 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69      in determini
1f070 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ng the value of 
1f080 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68  nInMul.  Note th
1f090 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  at the RHS of th
1f0a0 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f  e.    **    IN o
1f0b0 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20  perator must be 
1f0c0 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20  a SELECT, not a 
1f0d0 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20  value list, for 
1f0e0 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20  this variable.  
1f0f0 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72    **    to be tr
1f100 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ue..    **.    *
1f110 2a 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20  *  rangeDiv:.   
1f120 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61   **    An estima
1f130 74 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20  te of a divisor 
1f140 62 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75  by which to redu
1f150 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
1f160 61 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20  ace due.    **  
1f170 20 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20    to inequality 
1f180 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e  constraints.  In
1f190 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
1f1a0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41  sqlite_stat3 ANA
1f1b0 4c 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64  LYZE.    **    d
1f1c0 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e  ata, a single in
1f1d0 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
1f1e0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1f1f0 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20  e to 1/4rd its. 
1f200 20 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61     **    origina
1f210 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76  l size (rangeDiv
1f220 3d 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75  ==4).  Two inequ
1f230 61 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74  alities reduce t
1f240 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a  he search.    **
1f250 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31      space to 1/1
1f260 36 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69  6th of its origi
1f270 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44  nal size (rangeD
1f280 69 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a  iv==16)..    **.
1f290 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20      **  bSort:  
1f2a0 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c   .    **    Bool
1f2b0 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65  ean. True if the
1f2c0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1f2d0 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69  Y clause that wi
1f2e0 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20  ll require an . 
1f2f0 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61     **    externa
1f300 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61  l sort (i.e. sca
1f310 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  nning the index 
1f320 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1f330 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a  will not .    **
1f340 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72      correctly or
1f350 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20  der records)..  
1f360 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69    **.    **  bDi
1f370 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f  st:.    **    Bo
1f380 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74  olean. True if t
1f390 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e  here is a DISTIN
1f3a0 43 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  CT clause that w
1f3b0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1f3c0 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1f3d0 61 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a  al btree..    **
1f3e0 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70  .    **  bLookup
1f3f0 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  : .    **    Boo
1f400 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20  lean. True if a 
1f410 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20  table lookup is 
1f420 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
1f430 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20  h index entry.  
1f440 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e    **    visited.
1f450 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f460 2c 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  , true if this i
1f470 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  s not a covering
1f480 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20   index..    **  
1f490 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73    This is always
1f4a0 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72   false for the r
1f4b0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1f4c0 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
1f4d0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72  e..    **    For
1f4e0 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20   other indexes, 
1f4f0 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73  it is true unles
1f500 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  s all the column
1f510 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20  s of the table. 
1f520 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79     **    used by
1f530 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1f540 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e  ement are presen
1f550 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28  t in the index (
1f560 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20  such an.    **  
1f570 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74    index is somet
1f580 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61  imes described a
1f590 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1f5a0 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46  ex)..    **    F
1f5b0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65  or example, give
1f5c0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28  n the index on (
1f5d0 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e  a, b), the secon
1f5e0 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d of the followi
1f5f0 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77  ng .    **    tw
1f600 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72  o queries requir
1f610 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  es table b-tree 
1f620 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72  lookups in order
1f630 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c   to find the val
1f640 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20  ue.    **    of 
1f650 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68  column c, but th
1f660 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74  e first does not
1f670 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
1f680 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20   a and b are.   
1f690 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69   **    both avai
1f6a0 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64  lable in the ind
1f6b0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1f6c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1f6d0 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f  LECT a, b    FRO
1f6e0 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1f6f0 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  1;.    **       
1f700 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1f710 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48  b, c FROM tbl WH
1f720 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1f730 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74  /.    int bInEst
1f740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f750 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22      /* True if "
1f760 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29  x IN (SELECT...)
1f770 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  " seen */.    in
1f780 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20  t nInMul = 1;   
1f790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f7a0 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
1f7b0 74 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20  t equalities to 
1f7c0 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64 6f  lookup */.    do
1f7d0 75 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d 20  uble rangeDiv = 
1f7e0 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 45  (double)1;  /* E
1f7f0 73 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69  stimated reducti
1f800 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61  on in search spa
1f810 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ce */.    int nB
1f820 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ound = 0;       
1f830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f840 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  r of range const
1f850 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20  raints seen */. 
1f860 20 20 20 63 68 61 72 20 62 53 6f 72 74 20 3d 20     char bSort = 
1f870 62 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20  bSortInit;      
1f880 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65   /* True if exte
1f890 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72  rnal sort requir
1f8a0 65 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62  ed */.    char b
1f8b0 44 69 73 74 20 3d 20 62 44 69 73 74 49 6e 69 74  Dist = bDistInit
1f8c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1f8d0 69 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  if index cannot 
1f8e0 68 65 6c 70 20 77 69 74 68 20 44 49 53 54 49 4e  help with DISTIN
1f8f0 43 54 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62  CT */.    char b
1f900 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20  Lookup = 0;     
1f910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f920 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e  if not a coverin
1f930 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57  g index */.    W
1f940 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f960 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
1f970 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f980 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
1f990 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
1f9a0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f9b0 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20  FirstTerm = 0;  
1f9c0 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20    /* First term 
1f9d0 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64  matching the ind
1f9e0 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ex */.#endif..  
1f9f0 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28    /*WHERETRACE((
1fa00 0a 20 20 20 20 20 20 22 20 20 20 25 73 28 25 73  .      "   %s(%s
1fa10 29 3a 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53 72  ):\n",.      pSr
1fa20 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
1fa30 28 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e  (pIdx ? pIdx->zN
1fa40 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 20  ame : "ipk").   
1fa50 20 29 29 3b 2a 2f 0a 20 20 20 20 6d 65 6d 73 65   ));*/.    memse
1fa60 74 28 26 70 63 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&pc, 0, sizeof
1fa70 28 70 63 29 29 3b 0a 20 20 20 20 70 63 2e 70 6c  (pc));.    pc.pl
1fa80 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e 50 72 69  an.nOBSat = nPri
1fa90 6f 72 53 61 74 3b 0a 0a 20 20 20 20 2f 2a 20 44  orSat;..    /* D
1faa0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
1fab0 75 65 73 20 6f 66 20 70 63 2e 70 6c 61 6e 2e 6e  ues of pc.plan.n
1fac0 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f  Eq and nInMul */
1fad0 0a 20 20 20 20 66 6f 72 28 70 63 2e 70 6c 61 6e  .    for(pc.plan
1fae0 2e 6e 45 71 3d 30 3b 20 70 63 2e 70 6c 61 6e 2e  .nEq=0; pc.plan.
1faf0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
1fb00 75 6d 6e 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  umn; pc.plan.nEq
1fb10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
1fb20 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
1fb30 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d  umn[pc.plan.nEq]
1fb40 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1fb50 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1fb60 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
1fb70 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
1fb80 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  pIdx);.      if(
1fb90 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
1fba0 6b 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  k;.      pc.plan
1fbb0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45  .wsFlags |= (WHE
1fbc0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1fbd0 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20  RE_ROWID_EQ);.  
1fbe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fbf0 65 72 6d 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b  erm->pWC!=pWC );
1fc00 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1fc10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1fc20 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
1fc30 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
1fc40 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1fc50 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1fc60 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1fc70 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
1fc80 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1fc90 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1fca0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1fcb0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
1fcc0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73  ELECT ...)":  As
1fcd0 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20  sume the SELECT 
1fce0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
1fcf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  */.          nIn
1fd00 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
1fd10 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
1fd20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1fd30 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
1fd40 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
1fd50 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1fd60 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1fd70 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
1fd80 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
1fd90 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1fda0 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  l *= pExpr->x.pL
1fdb0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1fdc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1fdd0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1fde0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
1fdf0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  LL ){.        pc
1fe00 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1fe10 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1fe20 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  LL;.      }.#ifd
1fe30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1fe40 5f 53 54 41 54 33 0a 20 20 20 20 20 20 69 66 28  _STAT3.      if(
1fe50 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 30 20   pc.plan.nEq==0 
1fe60 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70  && pProbe->aSamp
1fe70 6c 65 20 29 20 70 46 69 72 73 74 54 65 72 6d 20  le ) pFirstTerm 
1fe80 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a  = pTerm;.#endif.
1fe90 20 20 20 20 20 20 70 63 2e 75 73 65 64 20 7c 3d        pc.used |=
1fea0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1feb0 67 68 74 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  ght;.    }. .   
1fec0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
1fed0 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
1fee0 64 20 69 73 20 55 4e 49 51 55 45 2c 20 61 6e 64  d is UNIQUE, and
1fef0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 71 75   there is an equ
1ff00 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 63 6f  ality .    ** co
1ff10 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61 6c 6c  nstraint for all
1ff20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1ff30 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 69 73  index, then this
1ff40 20 73 65 61 72 63 68 20 77 69 6c 6c 20 66 69 6e   search will fin
1ff50 64 0a 20 20 20 20 2a 2a 20 61 74 20 6d 6f 73 74  d.    ** at most
1ff60 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 20 49   a single row. I
1ff70 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
1ff80 74 68 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45  the WHERE_UNIQUE
1ff90 20 66 6c 61 67 20 74 6f 20 0a 20 20 20 20 2a 2a   flag to .    **
1ffa0 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 20 74   indicate this t
1ffb0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
1ffc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
1ffd0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 73 65  rwise, if the se
1ffe0 61 72 63 68 20 6d 61 79 20 66 69 6e 64 20 6d 6f  arch may find mo
1fff0 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 2c  re than one row,
20000 20 74 65 73 74 20 74 6f 20 73 65 65 20 69 66 0a   test to see if.
20010 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
20020 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  a range constrai
20030 6e 74 20 6f 6e 20 69 6e 64 65 78 65 64 20 63 6f  nt on indexed co
20040 6c 75 6d 6e 20 28 70 63 2e 70 6c 61 6e 2e 6e 45  lumn (pc.plan.nE
20050 71 2b 31 29 20 74 68 61 74 0a 20 20 20 20 2a 2a  q+1) that.    **
20060 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
20070 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
20080 78 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  x. .    */.    i
20090 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d  f( pc.plan.nEq==
200a0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
200b0 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
200c0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
200d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
200e0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
200f0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
20100 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
20110 73 65 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c  se( pc.plan.wsFl
20120 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
20130 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  MN_NULL );.     
20140 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77 73   if( (pc.plan.ws
20150 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
20160 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
20170 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20  OLUMN_NULL))==0 
20180 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  ){.        pc.pl
20190 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
201a0 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
201b0 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20      if( p->i==0 
201c0 7c 7c 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d  || (p->aLevel[p-
201d0 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >i-1].plan.wsFla
201e0 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55  gs & WHERE_ALL_U
201f0 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
20200 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
20210 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20220 41 4c 4c 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ALL_UNIQUE;.    
20230 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20240 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
20250 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
20260 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  0 ){.      int j
20270 3b 0a 20 20 20 20 20 20 6a 20 3d 20 28 70 63 2e  ;.      j = (pc.
20280 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62 65  plan.nEq==pProbe
20290 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a  ->nColumn ? -1 :
202a0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
202b0 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b  n[pc.plan.nEq]);
202c0 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54  .      if( findT
202d0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
202e0 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
202f0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
20300 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b  |WO_GE, pIdx) ){
20310 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
20320 72 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d 3b  rm *pTop, *pBtm;
20330 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20  .        pTop = 
20340 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
20350 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
20360 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
20370 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
20380 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  pBtm = findTerm(
20390 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d  pWC, iCur, j, p-
203a0 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54  >notReady, WO_GT
203b0 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20  |WO_GE, pIdx);. 
203c0 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67         whereRang
203d0 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
203e0 20 70 50 72 6f 62 65 2c 20 70 63 2e 70 6c 61 6e   pProbe, pc.plan
203f0 2e 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70  .nEq, pBtm, pTop
20400 2c 20 26 72 61 6e 67 65 44 69 76 29 3b 0a 20 20  , &rangeDiv);.  
20410 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20 29        if( pTop )
20420 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
20430 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nd = 1;.        
20440 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
20450 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
20460 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
20470 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d  pc.used |= pTop-
20480 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
20490 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
204a0 28 20 70 54 6f 70 2d 3e 70 57 43 21 3d 70 57 43  ( pTop->pWC!=pWC
204b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
204c0 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
204d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
204e0 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nd++;.          
204f0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
20500 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  |= WHERE_BTM_LIM
20510 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  IT;.          pc
20520 2e 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70  .used |= pBtm->p
20530 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
20540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20550 70 42 74 6d 2d 3e 70 57 43 21 3d 70 57 43 20 29  pBtm->pWC!=pWC )
20560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20570 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
20580 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
20590 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
205a0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
205b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
205c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
205d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
205e0 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65  use and the inde
205f0 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  x being consider
20600 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e  ed will.    ** n
20610 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f  aturally scan ro
20620 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72  ws in the requir
20630 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68  ed order, set th
20640 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c  e appropriate fl
20650 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 70 63  ags.    ** in pc
20660 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f  .plan.wsFlags. O
20670 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
20680 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
20690 59 20 63 6c 61 75 73 65 20 62 75 74 0a 20 20 20  Y clause but.   
206a0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 69   ** the index wi
206b0 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20  ll scan rows in 
206c0 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
206d0 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74  r, set the bSort
206e0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
206f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53  .  */.    if( bS
20700 6f 72 74 20 26 26 20 28 70 53 72 63 2d 3e 6a 6f  ort && (pSrc->jo
20710 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
20720 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
20730 74 20 62 52 65 76 20 3d 20 32 3b 0a 20 20 20 20  t bRev = 2;.    
20740 20 20 69 6e 74 20 62 4f 62 55 6e 69 71 75 65 20    int bObUnique 
20750 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 57 48 45  = 0;.      /*WHE
20760 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
20770 2d 2d 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72  --> before isSor
20780 74 49 6e 64 65 78 3a 20 6e 50 72 69 6f 72 53 61  tIndex: nPriorSa
20790 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f 72 53 61  t=%d\n",nPriorSa
207a0 74 29 29 3b 2a 2f 0a 20 20 20 20 20 20 70 63 2e  t));*/.      pc.
207b0 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69 73  plan.nOBSat = is
207c0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c 20  SortingIndex(p, 
207d0 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26 62  pProbe, iCur, &b
207e0 52 65 76 2c 20 26 62 4f 62 55 6e 69 71 75 65 29  Rev, &bObUnique)
207f0 3b 0a 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54  ;.      /*WHERET
20800 52 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d 3e  RACE(("      -->
20810 20 61 66 74 65 72 20 20 69 73 53 6f 72 74 49 6e   after  isSortIn
20820 64 65 78 3a 20 62 52 65 76 3d 25 64 20 62 4f 62  dex: bRev=%d bOb
20830 55 3d 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e  U=%d nOBSat=%d\n
20840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20850 20 20 20 20 20 62 52 65 76 2c 20 62 4f 62 55 6e       bRev, bObUn
20860 69 71 75 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 4f  ique, pc.plan.nO
20870 42 53 61 74 29 29 3b 2a 2f 0a 20 20 20 20 20 20  BSat));*/.      
20880 69 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70 63  if( nPriorSat<pc
20890 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c 20  .plan.nOBSat || 
208a0 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
208b0 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49   & WHERE_ALL_UNI
208c0 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  QUE)!=0 ){.     
208d0 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
208e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
208f0 52 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RED;.        if(
20900 20 62 4f 62 55 6e 69 71 75 65 20 29 20 70 63 2e   bObUnique ) pc.
20910 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
20920 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51 55 45 3b  WHERE_OB_UNIQUE;
20930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20940 66 28 20 6e 4f 72 64 65 72 42 79 3d 3d 70 63 2e  f( nOrderBy==pc.
20950 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 7b 0a 20  plan.nOBSat ){. 
20960 20 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30         bSort = 0
20970 3b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61  ;.        pc.pla
20980 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
20990 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
209a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
209b0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
209c0 20 69 66 28 20 62 52 65 76 20 26 20 31 20 29 20   if( bRev & 1 ) 
209d0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
209e0 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
209f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20a00 49 66 20 74 68 65 72 65 20 69 73 20 61 20 44 49  If there is a DI
20a10 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
20a20 20 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20   and this index 
20a30 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69  will scan rows i
20a40 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f  n.    ** order o
20a50 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
20a60 78 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61  xpressions, clea
20a70 72 20 62 44 69 73 74 20 61 6e 64 20 73 65 74 20  r bDist and set 
20a80 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
20a90 20 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20      ** flags in 
20aa0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e  pc.plan.wsFlags.
20ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 44 69 73   */.    if( bDis
20ac0 74 0a 20 20 20 20 20 26 26 20 69 73 44 69 73 74  t.     && isDist
20ad0 69 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65  inctIndex(pParse
20ae0 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69  , pWC, pProbe, i
20af0 43 75 72 2c 20 70 2d 3e 70 44 69 73 74 69 6e 63  Cur, p->pDistinc
20b00 74 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a  t, pc.plan.nEq).
20b10 20 20 20 20 20 26 26 20 28 70 63 2e 70 6c 61 6e       && (pc.plan
20b20 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20b30 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20  _COLUMN_IN)==0. 
20b40 20 20 20 29 7b 0a 20 20 20 20 20 20 62 44 69 73     ){.      bDis
20b50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 63 2e  t = 0;.      pc.
20b60 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
20b70 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
20b80 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  E|WHERE_COLUMN_R
20b90 41 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49  ANGE|WHERE_DISTI
20ba0 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  NCT;.    }..    
20bb0 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20  /* If currently 
20bc0 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20  calculating the 
20bd0 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e  cost of using an
20be0 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20   index (not the 
20bf0 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  IPK.    ** index
20c00 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ), determine if 
20c10 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c  all required col
20c20 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20  umn data may be 
20c30 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
20c40 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74   .    ** using t
20c50 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69  he main table (i
20c60 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78  .e. if the index
20c70 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20   is a covering. 
20c80 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20     ** index for 
20c90 74 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20  this query). If 
20ca0 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57  it is, set the W
20cb0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c  HERE_IDX_ONLY fl
20cc0 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 70 63 2e  ag in.    ** pc.
20cd0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74  plan.wsFlags. Ot
20ce0 68 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65  herwise, set the
20cf0 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c   bLookup variabl
20d00 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e to true.  */. 
20d10 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
20d20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
20d30 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
20d40 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
20d50 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
20d60 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
20d70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
20d80 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
20d90 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
20da0 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
20db0 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
20dc0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
20dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20de0 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
20df0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70   ){.        pc.p
20e00 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
20e10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
20e20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20e30 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b      bLookup = 1;
20e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20e50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73      /*.    ** Es
20e60 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
20e70 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74  r of rows of out
20e80 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20  put.  For an "x 
20e90 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a  IN (SELECT...)".
20ea0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
20eb0 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  t, do not let th
20ec0 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65  e estimate excee
20ed0 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20  d half the rows 
20ee0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  in the table..  
20ef0 20 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e    */.    pc.plan
20f00 2e 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  .nRow = (double)
20f10 28 61 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61  (aiRowEst[pc.pla
20f20 6e 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29  n.nEq] * nInMul)
20f30 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74  ;.    if( bInEst
20f40 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77   && pc.plan.nRow
20f50 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  *2>aiRowEst[0] )
20f60 7b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e  {.      pc.plan.
20f70 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b  nRow = aiRowEst[
20f80 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d  0]/2;.      nInM
20f90 75 6c 20 3d 20 28 69 6e 74 29 28 70 63 2e 70 6c  ul = (int)(pc.pl
20fa0 61 6e 2e 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45  an.nRow / aiRowE
20fb0 73 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29  st[pc.plan.nEq])
20fc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
20fd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
20fe0 41 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  AT3.    /* If th
20ff0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
21000 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41  of the form x=VA
21010 4c 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c  LUE or x IN (E1,
21020 45 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61  E2,...).    ** a
21030 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69  nd we do not thi
21040 6e 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f  nk that values o
21050 66 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61  f x are unique a
21060 6e 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a  nd if histogram.
21070 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61      ** data is a
21080 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c  vailable for col
21090 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d  umn x, then it m
210a0 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
210b0 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61  .    ** to get a
210c0 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65   better estimate
210d0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
210e0 66 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a  f rows based on.
210f0 20 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64      ** VALUE and
21100 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74   how common that
21110 20 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64   value is accord
21120 69 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f  ing to the histo
21130 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gram..    */.   
21140 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f   if( pc.plan.nRo
21150 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 70  w>(double)1 && p
21160 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20  c.plan.nEq==1.  
21170 20 20 20 26 26 20 70 46 69 72 73 74 54 65 72 6d     && pFirstTerm
21180 21 3d 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b  !=0 && aiRowEst[
21190 31 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73  1]>1 ){.      as
211a0 73 65 72 74 28 20 28 70 46 69 72 73 74 54 65 72  sert( (pFirstTer
211b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
211c0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
211d0 57 4f 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20  WO_IN))!=0 );.  
211e0 20 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65      if( pFirstTe
211f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21200 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
21210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  ) ){.        tes
21220 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
21230 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
21240 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
21250 74 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74  testcase( pFirst
21260 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21270 26 20 57 4f 5f 45 51 55 49 56 20 29 3b 0a 20 20  & WO_EQUIV );.  
21280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21290 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65  pFirstTerm->eOpe
212a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
212b0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  L );.        whe
212c0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
212d0 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
212e0 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72  FirstTerm->pExpr
212f0 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20  ->pRight,.      
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21310 20 20 20 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f      &pc.plan.nRo
21320 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  w);.      }else 
21330 69 66 28 20 62 49 6e 45 73 74 3d 3d 30 20 29 7b  if( bInEst==0 ){
21340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21350 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70   pFirstTerm->eOp
21360 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
21370 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 49  ;.        whereI
21380 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
21390 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54   pProbe, pFirstT
213a0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c  erm->pExpr->x.pL
213b0 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
213c0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 63 2e              &pc.
213d0 70 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20  plan.nRow);.    
213e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
213f0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
21400 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20 20  E_STAT3 */..    
21410 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e 75  /* Adjust the nu
21420 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
21430 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61 72 64  ows and downward
21440 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77 73   to reflect rows
21450 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65  .    ** that are
21460 20 65 78 63 6c 75 64 65 64 20 62 79 20 72 61 6e   excluded by ran
21470 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ge constraints..
21480 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c      */.    pc.pl
21490 61 6e 2e 6e 52 6f 77 20 3d 20 70 63 2e 70 6c 61  an.nRow = pc.pla
214a0 6e 2e 6e 52 6f 77 2f 72 61 6e 67 65 44 69 76 3b  n.nRow/rangeDiv;
214b0 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e  .    if( pc.plan
214c0 2e 6e 52 6f 77 3c 31 20 29 20 70 63 2e 70 6c 61  .nRow<1 ) pc.pla
214d0 6e 2e 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20  n.nRow = 1;..   
214e0 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20   /* Experiments 
214f0 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69  run on real SQLi
21500 74 65 20 64 61 74 61 62 61 73 65 73 20 73 68 6f  te databases sho
21510 77 20 74 68 61 74 20 74 68 65 20 74 69 6d 65 20  w that the time 
21520 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f  needed.    ** to
21530 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
21540 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  rch to locate a 
21550 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f  row in a table o
21560 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68  r index is rough
21570 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28  ly.    ** log10(
21580 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d  N) times the tim
21590 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f  e to move from o
215a0 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65  ne row to the ne
215b0 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20  xt row within.  
215c0 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20    ** a table or 
215d0 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63 74 75  index.  The actu
215e0 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72  al times can var
215f0 79 2c 20 77 69 74 68 20 74 68 65 20 73 69 7a 65  y, with the size
21600 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72   of.    ** recor
21610 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f  ds being an impo
21620 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42  rtant factor.  B
21630 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65  oth moves and se
21640 61 72 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a  arches are.    *
21650 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61  * slower with la
21660 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72  rger records, pr
21670 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65  esumably because
21680 20 66 65 77 65 72 20 72 65 63 6f 72 64 73 20 66   fewer records f
21690 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65  it.    ** on one
216a0 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20   page and hence 
216b0 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76 65 20  more pages have 
216c0 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20  to be fetched.. 
216d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
216e0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
216f0 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
21700 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65  stat1 and sqlite
21710 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20 64 6f  _stat3 tables do
21720 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65  .    ** not give
21730 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20   us data on the 
21740 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
21750 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  f table and inde
21760 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  x records..    *
21770 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74  * So this comput
21780 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61  ation assumes ta
21790 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  ble records are 
217a0 61 62 6f 75 74 20 74 77 69 63 65 20 61 73 20 62  about twice as b
217b0 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64  ig.    ** as ind
217c0 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a  ex records.    *
217d0 2f 0a 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c  /.    if( (pc.pl
217e0 61 6e 2e 77 73 46 6c 61 67 73 26 7e 28 57 48 45  an.wsFlags&~(WHE
217f0 52 45 5f 52 45 56 45 52 53 45 7c 57 48 45 52 45  RE_REVERSE|WHERE
21800 5f 4f 52 44 45 52 45 44 7c 57 48 45 52 45 5f 4f  _ORDERED|WHERE_O
21810 42 5f 55 4e 49 51 55 45 29 29 0a 20 20 20 20 20  B_UNIQUE)).     
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 3d 3d 57 48 45 52 45           ==WHERE
21860 5f 49 44 58 5f 4f 4e 4c 59 0a 20 20 20 20 20 26  _IDX_ONLY.     &
21870 26 20 28 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  & (pWC->wctrlFla
21880 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
21890 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
218a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
218b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
218c0 69 73 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  is.     && Optim
218d0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
218e0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
218f0 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
21900 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
21910 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
21920 74 20 75 73 65 66 75 6c 20 66 6f 72 20 69 6e 64  t useful for ind
21930 65 78 69 6e 67 2c 20 62 75 74 20 69 74 20 69 73  exing, but it is
21940 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
21950 78 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20 66 75  x..      ** A fu
21960 6c 6c 2d 73 63 61 6e 20 6f 66 20 74 68 65 20 69  ll-scan of the i
21970 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 61 20  ndex might be a 
21980 6c 69 74 74 6c 65 20 66 61 73 74 65 72 20 74 68  little faster th
21990 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61 6e 0a 20  an a full-scan. 
219a0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74       ** of the t
219b0 61 62 6c 65 2c 20 73 6f 20 67 69 76 65 20 74 68  able, so give th
219c0 69 73 20 63 61 73 65 20 61 20 63 6f 73 74 20 73  is case a cost s
219d0 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 74 68 61  lightly less tha
219e0 6e 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  n a table.      
219f0 2a 2a 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ** scan. */.    
21a00 20 20 70 63 2e 72 43 6f 73 74 20 3d 20 61 69 52    pc.rCost = aiR
21a10 6f 77 45 73 74 5b 30 5d 2a 33 20 2b 20 70 50 72  owEst[0]*3 + pPr
21a20 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  obe->nColumn;.  
21a30 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
21a40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56  ags |= WHERE_COV
21a50 45 52 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f  ER_SCAN|WHERE_CO
21a60 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
21a70 7d 65 6c 73 65 20 69 66 28 20 28 70 63 2e 70 6c  }else if( (pc.pl
21a80 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
21a90 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
21aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
21ab0 54 68 65 20 63 6f 73 74 20 6f 66 20 61 20 66 75  The cost of a fu
21ac0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
21ad0 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76   a number of mov
21ae0 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 65 71 75  e operations equ
21af0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  al.      ** to t
21b00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
21b10 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
21b20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21b30 2a 20 57 65 20 61 64 64 20 61 6e 20 61 64 64 69  * We add an addi
21b40 74 69 6f 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74  tional 4x penalt
21b50 79 20 74 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20  y to full table 
21b60 73 63 61 6e 73 2e 20 20 54 68 69 73 20 63 61 75  scans.  This cau
21b70 73 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ses.      ** the
21b80 20 63 6f 73 74 20 66 75 6e 63 74 69 6f 6e 20 74   cost function t
21b90 6f 20 65 72 72 20 6f 6e 20 74 68 65 20 73 69 64  o err on the sid
21ba0 65 20 6f 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e  e of choosing an
21bb0 20 69 6e 64 65 78 20 6f 76 65 72 0a 20 20 20 20   index over.    
21bc0 20 20 2a 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20    ** choosing a 
21bd0 66 75 6c 6c 20 73 63 61 6e 2e 20 20 54 68 69 73  full scan.  This
21be0 20 34 78 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65   4x full-scan pe
21bf0 6e 61 6c 74 79 20 69 73 20 61 6e 20 61 72 67 75  nalty is an argu
21c00 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  able.      ** de
21c10 63 69 73 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77  cision and one w
21c20 68 69 63 68 20 77 65 20 65 78 70 65 63 74 20 74  hich we expect t
21c30 6f 20 72 65 76 69 73 69 74 20 69 6e 20 74 68 65  o revisit in the
21c40 20 66 75 74 75 72 65 2e 20 20 42 75 74 0a 20 20   future.  But.  
21c50 20 20 20 20 2a 2a 20 69 74 20 73 65 65 6d 73 20      ** it seems 
21c60 74 6f 20 62 65 20 77 6f 72 6b 69 6e 67 20 77 65  to be working we
21c70 6c 6c 20 65 6e 6f 75 67 68 20 61 74 20 74 68 65  ll enough at the
21c80 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a   moment..      *
21c90 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  /.      pc.rCost
21ca0 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34   = aiRowEst[0]*4
21cb0 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e  ;.      pc.plan.
21cc0 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
21cd0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
21ce0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
21cf0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
21d00 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
21d10 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 20  ORDERED;.       
21d20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20   pc.plan.nOBSat 
21d30 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20  = nPriorSat;.   
21d40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21d50 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65        log10N = e
21d60 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30  stLog(aiRowEst[0
21d70 5d 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f  ]);.      pc.rCo
21d80 73 74 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  st = pc.plan.nRo
21d90 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  w;.      if( pId
21da0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  x ){.        if(
21db0 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20   bLookup ){.    
21dc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
21dd0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c  index lookup fol
21de0 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c 65  lowed by a table
21df0 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
21e00 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20     **    nInMul 
21e10 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20 74  index searches t
21e20 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72 74  o find the start
21e30 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20 72   of each index r
21e40 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  ange.          *
21e50 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
21e60 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
21e70 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  x.          **  
21e80 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65 61  + nRow table sea
21e90 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20  rches to lookup 
21ea0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
21eb0 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a  using the rowid.
21ec0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21ed0 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20         pc.rCost 
21ee0 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 70 63 2e  += (nInMul + pc.
21ef0 70 6c 61 6e 2e 6e 52 6f 77 29 2a 6c 6f 67 31 30  plan.nRow)*log10
21f00 4e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  N;.        }else
21f10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
21f20 6f 72 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  or a covering in
21f30 64 65 78 3a 0a 20 20 20 20 20 20 20 20 20 20 2a  dex:.          *
21f40 2a 20 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64  *     nInMul ind
21f50 65 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66  ex searches to f
21f60 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ind the initial 
21f70 65 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 20  entry .         
21f80 20 2a 2a 20 20 20 2b 20 6e 52 6f 77 20 73 74 65   **   + nRow ste
21f90 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ps through the i
21fa0 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a  ndex.          *
21fb0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 72  /.          pc.r
21fc0 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  Cost += nInMul*l
21fd0 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d  og10N;.        }
21fe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21ff0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 72        /* For a r
22000 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
22010 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
22020 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20 74   **    nInMult t
22030 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f  able searches to
22040 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61   find the initia
22050 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  l entry for each
22060 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
22070 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
22080 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c  through the tabl
22090 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
220a0 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d       pc.rCost +=
220b0 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a   nInMul*log10N;.
220c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
220d0 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65     /* Add in the
220e0 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   estimated cost 
220f0 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72  of sorting the r
22100 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20 65  esult.  Actual e
22110 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20  xperimental.    
22120 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73 20  ** measurements 
22130 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66 6f  of sorting perfo
22140 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74 65  rmance in SQLite
22150 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74 69   show that sorti
22160 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61  ng time.    ** a
22170 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29  dds C*N*log10(N)
22180 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77 68   to the cost, wh
22190 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
221a0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62  ber of rows to b
221b0 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  e .    ** sorted
221c0 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63 74   and C is a fact
221d0 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35 20  or between 1.95 
221e0 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69 6c  and 4.3.  We wil
221f0 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20 20  l split the.    
22200 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61 6e  ** difference an
22210 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33 2e  d select C of 3.
22220 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  0..    */.    if
22230 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( bSort ){.     
22240 20 64 6f 75 62 6c 65 20 6d 20 3d 20 65 73 74 4c   double m = estL
22250 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  og(pc.plan.nRow*
22260 28 6e 4f 72 64 65 72 42 79 20 2d 20 70 63 2e 70  (nOrderBy - pc.p
22270 6c 61 6e 2e 6e 4f 42 53 61 74 29 2f 6e 4f 72 64  lan.nOBSat)/nOrd
22280 65 72 42 79 29 3b 0a 20 20 20 20 20 20 6d 20 2a  erBy);.      m *
22290 3d 20 28 64 6f 75 62 6c 65 29 28 70 63 2e 70 6c  = (double)(pc.pl
222a0 61 6e 2e 6e 4f 42 53 61 74 20 3f 20 32 20 3a 20  an.nOBSat ? 2 : 
222b0 33 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f  3);.      pc.rCo
222c0 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  st += pc.plan.nR
222d0 6f 77 2a 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ow*m;.    }.    
222e0 69 66 28 20 62 44 69 73 74 20 29 7b 0a 20 20 20  if( bDist ){.   
222f0 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70     pc.rCost += p
22300 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 65 73 74 4c  c.plan.nRow*estL
22310 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29  og(pc.plan.nRow)
22320 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  *3;.    }..    /
22330 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73 69  **** Cost of usi
22340 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  ng this index ha
22350 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75  s now been compu
22360 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f  ted ****/..    /
22370 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
22380 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72  dditional constr
22390 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74 61  aints on this ta
223a0 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a  ble that cannot.
223b0 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 77      ** be used w
223c0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
223d0 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63 68  index, but which
223e0 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68 65   might lower the
223f0 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f   number.    ** o
22400 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61  f output rows, a
22410 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20 76  djust the nRow v
22420 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  alue accordingly
22430 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20  .  This only .  
22440 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66 20    ** matters if 
22450 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65  the current inde
22460 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20 63  x is the least c
22470 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74  ostly, so do not
22480 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   bother.    ** w
22490 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69 66  ith this step if
224a0 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
224b0 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
224c0 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a   not be chosen..
224d0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76      ** Also, nev
224e0 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f 75  er reduce the ou
224f0 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62  tput row count b
22500 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68 69  elow 2 using thi
22510 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20  s step..    **. 
22520 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69 74     ** It is crit
22530 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e 6f  ical that the no
22540 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20 75  tValid mask be u
22550 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64  sed here instead
22560 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e   of.    ** the n
22570 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20 57  otReady mask.  W
22580 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e  hen computing an
22590 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65 78   "optimal" index
225a0 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a 20  , the notReady. 
225b0 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20     ** mask will 
225c0 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62 69  only have one bi
225d0 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74 20  t set - the bit 
225e0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
225f0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
22600 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c  e notValid mask,
22610 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
22620 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20 61  nd, always has a
22630 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72 0a  ll bits set for.
22640 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
22650 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75  at are not in ou
22660 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e  ter loops.  If n
22670 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64 20  otReady is used 
22680 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20 20  here instead.   
22690 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c   ** of notValid,
226a0 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20   then a optimal 
226b0 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65 6e  index that depen
226c0 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e  ds on inner join
226d0 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d  s loops.    ** m
226e0 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65 64  ight be selected
226f0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
22700 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69 6d   exists an optim
22710 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  al index that ha
22720 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68  s.    ** no such
22730 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20   dependency..   
22740 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70   */.    if( pc.p
22750 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 70 63  lan.nRow>2 && pc
22760 2e 72 43 6f 73 74 3c 3d 70 2d 3e 63 6f 73 74 2e  .rCost<=p->cost.
22770 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 69  rCost ){.      i
22780 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
22790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
227a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
227b0 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 45 71       int nSkipEq
227c0 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3b 20   = pc.plan.nEq; 
227d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
227e0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  = constraints to
227f0 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 69   skip */.      i
22800 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20  nt nSkipRange = 
22810 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e  nBound;     /* N
22820 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74  umber of < const
22830 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a  raints to skip *
22840 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  /.      Bitmask 
22850 74 68 69 73 54 61 62 3b 20 20 20 20 20 20 20 20  thisTab;        
22860 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 66       /* Bitmap f
22870 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20  or pSrc */..    
22880 20 20 74 68 69 73 54 61 62 20 3d 20 67 65 74 4d    thisTab = getM
22890 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
228a0 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 20 20  t, iCur);.      
228b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
228c0 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
228d0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26  pc.plan.nRow>2 &
228e0 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
228f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
22900 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22910 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
22920 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22930 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
22940 65 72 65 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74  ereqAll & p->not
22950 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62 20  Valid)!=thisTab 
22960 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22970 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
22980 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
22990 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
229a0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
229b0 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20  if( nSkipEq ){. 
229c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
229d0 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 70  nore the first p
229e0 63 2e 70 6c 61 6e 2e 6e 45 71 20 65 71 75 61 6c  c.plan.nEq equal
229f0 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e 63  ity matches sinc
22a00 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  e the index.    
22a10 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
22a20 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64  lready accounted
22a30 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20   for these */.  
22a40 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 45            nSkipE
22a50 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  q--;.          }
22a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22a70 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
22a80 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75 61   additional equa
22a90 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75 63  lity match reduc
22aa0 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  es the result.  
22ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
22ac0 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f   size by a facto
22ad0 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20 20  r of 10 */.     
22ae0 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
22af0 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20  Row /= 10;.     
22b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22b10 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
22b20 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
22b30 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
22b40 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  O_GE) ){.       
22b50 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e 67     if( nSkipRang
22b60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
22b70 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66   /* Ignore the f
22b80 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65 20  irst nSkipRange 
22b90 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
22ba0 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65  s since the inde
22bb0 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  x.            **
22bc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63   has already acc
22bd0 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65  ounted for these
22be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22bf0 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20  nSkipRange--;.  
22c00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
22c20 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69  sume each additi
22c30 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74  onal range const
22c40 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68  raint reduces th
22c50 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
22c60 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65       ** set size
22c70 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
22c80 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e 67  3.  Indexed rang
22c90 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
22ca0 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
22cb0 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73   ** the search s
22cc0 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65 72  pace by a larger
22cd0 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65 20   factor: 4.  We 
22ce0 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61 6e  make indexed ran
22cf0 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ge.            *
22d00 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  * more selective
22d10 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62   intentionally b
22d20 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  ecause of the su
22d30 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20 20  bjective .      
22d40 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76 61        ** observa
22d50 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78 65  tion that indexe
22d60 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  d range constrai
22d70 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  nts really are m
22d80 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
22d90 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e 20  ** selective in 
22da0 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76 65  practice, on ave
22db0 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rage. */.       
22dc0 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f       pc.plan.nRo
22dd0 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  w /= 3;.        
22de0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
22df0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
22e00 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4e 4f 4f  perator & WO_NOO
22e10 50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P)==0 ){.       
22e20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20     /* Any other 
22e30 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72  expression lower
22e40 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  s the output row
22e50 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a   count by half *
22e60 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70  /.          pc.p
22e70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20  lan.nRow /= 2;. 
22e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22e90 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70 6c  .      if( pc.pl
22ea0 61 6e 2e 6e 52 6f 77 3c 32 20 29 20 70 63 2e 70  an.nRow<2 ) pc.p
22eb0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 32 3b 0a 20 20  lan.nRow = 2;.  
22ec0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 57 48 45 52    }...    /*WHER
22ed0 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22  ETRACE((.      "
22ee0 20 20 20 20 20 20 6e 45 71 3d 25 64 20 6e 49 6e        nEq=%d nIn
22ef0 4d 75 6c 3d 25 64 20 72 61 6e 67 65 44 69 76 3d  Mul=%d rangeDiv=
22f00 25 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f  %d bSort=%d bLoo
22f10 6b 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30  kup=%d wsFlags=0
22f20 78 25 30 38 78 5c 6e 22 0a 20 20 20 20 20 20 22  x%08x\n".      "
22f30 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30        notReady=0
22f40 78 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e 31  x%llx log10N=%.1
22f50 66 20 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73 74  f nRow=%.1f cost
22f60 3d 25 2e 31 66 5c 6e 22 0a 20 20 20 20 20 20 22  =%.1f\n".      "
22f70 20 20 20 20 20 20 75 73 65 64 3d 30 78 25 6c 6c        used=0x%ll
22f80 78 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a  x nOBSat=%d\n",.
22f90 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 45        pc.plan.nE
22fa0 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29  q, nInMul, (int)
22fb0 72 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c  rangeDiv, bSort,
22fc0 20 62 4c 6f 6f 6b 75 70 2c 20 70 63 2e 70 6c 61   bLookup, pc.pla
22fd0 6e 2e 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20  n.wsFlags,.     
22fe0 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 6c 6f   p->notReady, lo
22ff0 67 31 30 4e 2c 20 70 63 2e 70 6c 61 6e 2e 6e 52  g10N, pc.plan.nR
23000 6f 77 2c 20 70 63 2e 72 43 6f 73 74 2c 20 70 63  ow, pc.rCost, pc
23010 2e 75 73 65 64 2c 0a 20 20 20 20 20 20 70 63 2e  .used,.      pc.
23020 70 6c 61 6e 2e 6e 4f 42 53 61 74 0a 20 20 20 20  plan.nOBSat.    
23030 29 29 3b 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ));*/..    /* If
23040 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
23050 68 65 20 62 65 73 74 20 77 65 20 68 61 76 65 20  he best we have 
23060 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65  seen so far, the
23070 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20 20  n record this.  
23080 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69    ** index and i
23090 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20 70  ts cost in the p
230a0 2d 3e 63 6f 73 74 20 73 74 72 75 63 74 75 72 65  ->cost structure
230b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
230c0 20 28 21 70 49 64 78 20 7c 7c 20 70 63 2e 70 6c   (!pIdx || pc.pl
230d0 61 6e 2e 77 73 46 6c 61 67 73 29 20 26 26 20 63  an.wsFlags) && c
230e0 6f 6d 70 61 72 65 43 6f 73 74 28 26 70 63 2c 20  ompareCost(&pc, 
230f0 26 70 2d 3e 63 6f 73 74 29 20 29 7b 0a 20 20 20  &p->cost) ){.   
23100 20 20 20 70 2d 3e 63 6f 73 74 20 3d 20 70 63 3b     p->cost = pc;
23110 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
23120 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 77  lan.wsFlags &= w
23130 73 46 6c 61 67 4d 61 73 6b 3b 0a 20 20 20 20 20  sFlagMask;.     
23140 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
23150 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  pIdx = pIdx;.   
23160 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
23170 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
23180 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
23190 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
231a0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
231b0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
231c0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
231d0 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ndex ) break;.. 
231e0 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b     /* Reset mask
231f0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  s for the next i
23200 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70  ndex in the loop
23210 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61   */.    wsFlagMa
23220 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
23230 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
23240 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
23250 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
23260 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20  TermMask;.  }.. 
23270 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
23280 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
23290 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54  se and the SQLIT
232a0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66  E_ReverseOrder f
232b0 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c  lag.  ** is set,
232c0 20 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68   then reverse th
232d0 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65  e order that the
232e0 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73   index will be s
232f0 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20  canned.  ** in. 
23300 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
23310 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73   application tes
23320 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69  ting, to help fi
23330 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68  nd cases.  ** wh
23340 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ere application 
23350 62 65 68 61 76 69 6f 72 20 64 65 70 65 6e 64 73  behavior depends
23360 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e   on the (undefin
23370 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20  ed) order that. 
23380 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75   ** SQLite outpu
23390 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68  ts rows in in th
233a0 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20  e absence of an 
233b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
233c0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70    */.  if( !p->p
233d0 4f 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73  OrderBy && pPars
233e0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
233f0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
23400 65 72 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  er ){.    p->cos
23410 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  t.plan.wsFlags |
23420 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
23430 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23440 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28  p->pOrderBy || (
23450 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
23460 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
23470 45 44 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ED)==0 );.  asse
23480 72 74 28 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  rt( p->cost.plan
23490 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70  .u.pIdx==0 || (p
234a0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
234b0 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f  ags&WHERE_ROWID_
234c0 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  EQ)==0 );.  asse
234d0 72 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  rt( pSrc->pIndex
234e0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
234f0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
23500 64 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  dx==0 .       ||
23510 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
23520 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64  pIdx==pSrc->pInd
23530 65 78 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 57 48  ex .  );..  /*WH
23540 45 52 45 54 52 41 43 45 28 28 22 20 20 20 62 65  ERETRACE(("   be
23550 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 20 63  st index is %s c
23560 6f 73 74 3d 25 2e 31 66 5c 6e 22 2c 0a 20 20 20  ost=%.1f\n",.   
23570 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
23580 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d 3e 63  an.u.pIdx ? p->c
23590 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  ost.plan.u.pIdx-
235a0 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 2c 0a  >zName : "ipk",.
235b0 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74           p->cost
235c0 2e 72 43 6f 73 74 29 29 3b 2a 2f 0a 20 20 0a 20  .rCost));*/.  . 
235d0 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
235e0 65 78 28 70 29 3b 0a 20 20 62 65 73 74 41 75 74  ex(p);.  bestAut
235f0 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 29 3b 0a  omaticIndex(p);.
23600 20 20 69 66 28 20 65 71 54 65 72 6d 4d 61 73 6b    if( eqTermMask
23610 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 20 70   & WO_ISNULL ) p
23620 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
23630 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4e 55 4c  ags |= WHERE_NUL
23640 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  L_OK;.}../*.** F
23650 69 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c  ind the query pl
23660 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  an for accessing
23670 20 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61   table pSrc->pTa
23680 62 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  b. Write the.** 
23690 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  best query plan 
236a0 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74  and its cost int
236b0 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20  o the WhereCost 
236c0 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20  object supplied 
236d0 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20  .** as the last 
236e0 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20  parameter. This 
236f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c  function may cal
23700 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20  culate the cost 
23710 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20  of.** both real 
23720 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  and virtual tabl
23730 65 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  e scans..**.** T
23740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
23750 73 20 6e 6f 74 20 74 61 6b 65 20 4f 52 44 45 52  s not take ORDER
23760 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
23770 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e  into account.  N
23780 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 72 65  or.** does it re
23790 6d 65 6d 62 65 72 20 74 68 65 20 76 69 72 74 75  member the virtu
237a0 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 70  al table query p
237b0 6c 61 6e 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65  lan.  All it doe
237c0 73 20 69 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  s is compute.** 
237d0 74 68 65 20 63 6f 73 74 20 77 68 69 6c 65 20 64  the cost while d
237e0 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e  etermining if an
237f0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
23800 20 69 73 20 61 70 70 6c 69 63 61 62 6c 65 2e 20   is applicable. 
23810 20 54 68 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20   The.** details 
23820 77 69 6c 6c 20 62 65 20 72 65 63 6f 6e 73 69 64  will be reconsid
23830 65 72 65 64 20 6c 61 74 65 72 20 69 66 20 74 68  ered later if th
23840 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
23850 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a  s found to be.**
23860 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a   applicable..*/.
23870 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
23880 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49  Index(WhereBestI
23890 64 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20  dx *p){.#ifndef 
238a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
238b0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
238c0 73 56 69 72 74 75 61 6c 28 70 2d 3e 70 53 72 63  sVirtual(p->pSrc
238d0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  ->pTab) ){.    s
238e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
238f0 6f 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b  o *pIdxInfo = 0;
23900 0a 20 20 20 20 70 2d 3e 70 70 49 64 78 49 6e 66  .    p->ppIdxInf
23910 6f 20 3d 20 26 70 49 64 78 49 6e 66 6f 3b 0a 20  o = &pIdxInfo;. 
23920 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e     bestVirtualIn
23930 64 65 78 28 70 29 3b 0a 20 20 20 20 61 73 73 65  dex(p);.    asse
23940 72 74 28 20 70 49 64 78 49 6e 66 6f 21 3d 30 20  rt( pIdxInfo!=0 
23950 7c 7c 20 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62  || p->pParse->db
23960 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23970 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
23980 66 6f 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e  fo && pIdxInfo->
23990 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
239a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
239b0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
239c0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  >idxStr);.    }.
239d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
239e0 65 28 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  e(p->pParse->db,
239f0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 7d 65   pIdxInfo);.  }e
23a00 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
23a10 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
23a20 78 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  x(p);.  }.}../*.
23a30 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
23a40 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
23a50 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
23a60 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
23a70 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
23a80 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
23a90 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
23aa0 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
23ab0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
23ac0 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
23ad0 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
23ae0 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
23af0 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
23b00 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
23b10 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
23b20 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
23b30 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
23b40 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
23b50 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
23b60 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
23b70 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
23b80 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
23b90 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
23ba0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
23bb0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23bc0 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
23bd0 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
23be0 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
23bf0 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
23c00 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
23c10 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
23c20 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
23c30 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
23c40 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
23c50 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
23c60 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
23c70 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
23c80 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
23c90 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
23ca0 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
23cb0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
23cc0 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38  N-OF: R-24597-58
23cd0 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65  655 No tests are
23ce0 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20   done for terms 
23cf0 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70  that are.** comp
23d00 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64  letely satisfied
23d10 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a   by indices..**.
23d20 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
23d30 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
23d40 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
23d50 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
23d60 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
23d70 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
23d80 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
23d90 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
23da0 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
23db0 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
23dc0 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
23dd0 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
23de0 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
23df0 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
23e00 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
23e10 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
23e20 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
23e30 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
23e40 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
23e50 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
23e60 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
23e70 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
23e80 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
23e90 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
23ea0 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
23eb0 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
23ec0 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
23ed0 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
23ee0 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
23ef0 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
23f00 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
23f10 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
23f20 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
23f30 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
23f40 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
23f50 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
23f60 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
23f70 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
23f80 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
23f90 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
23fa0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
23fb0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
23fc0 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
23fd0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
23fe0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
23ff0 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
24000 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
24010 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
24020 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
24030 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
24040 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
24050 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
24060 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
24070 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
24080 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
24090 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
240a0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
240b0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
240c0 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
240d0 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
240e0 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
240f0 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
24100 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
24110 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
24120 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
24130 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
24140 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
24150 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
24160 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
24170 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
24180 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
24190 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
241a0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
241b0 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
241c0 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
241d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
241e0 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
241f0 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
24200 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
24210 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
24220 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
24230 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
24240 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
24250 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
24260 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
24270 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
24280 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
24290 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
242a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
242b0 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
242c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
242d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
242e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
242f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
24300 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
24310 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
24320 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
24330 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
24340 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
24350 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
24360 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
24370 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
24380 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
24390 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
243a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
243b0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
243c0 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
243d0 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
243e0 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
243f0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
24400 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
24410 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
24420 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
24430 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
24440 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
24450 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
24460 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
24470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24480 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
24490 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
244a0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
244b0 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
244c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
244d0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
244e0 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
244f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
24500 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
24510 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
24520 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
24530 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
24540 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
24550 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
24560 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
24570 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
24580 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
24590 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
245a0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
245b0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
245c0 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
245d0 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
245e0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
245f0 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
24600 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
24610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
24620 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
24630 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
24640 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
24650 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
24660 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
24670 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
24680 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
24690 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
246a0 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
246b0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
246c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
246d0 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
246e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
246f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
24700 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
24710 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
24720 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
24730 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
24740 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
24750 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
24760 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68  l *pLevel, /* Th
24770 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  e level of the F
24780 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
24790 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
247a0 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20    int iEq,      
247b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
247c0 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  f the equality t
247d0 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20  erm within this 
247e0 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  level */.  int i
247f0 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f  Target         /
24800 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61  * Attempt to lea
24810 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  ve results in th
24820 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
24830 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70  {.  Expr *pX = p
24840 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56  Term->pExpr;.  V
24850 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
24860 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52  >pVdbe;.  int iR
24870 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
24880 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
24890 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73   holding results
248a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
248b0 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  Target>0 );.  if
248c0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  ( pX->op==TK_EQ 
248d0 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  ){.    iReg = sq
248e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
248f0 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  get(pParse, pX->
24900 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
24910 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58  ;.  }else if( pX
24920 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op==TK_ISNULL 
24930 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  ){.    iReg = iT
24940 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74  arget;.    sqlit
24950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24960 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67  OP_Null, 0, iReg
24970 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
24980 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
24990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
249a0 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20   eType;.    int 
249b0 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74  iTab;.    struct
249c0 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
249d0 20 20 75 38 20 62 52 65 76 20 3d 20 28 70 4c 65    u8 bRev = (pLe
249e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
249f0 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
24a00 45 29 21 3d 30 3b 0a 0a 20 20 20 20 69 66 28 20  E)!=0;..    if( 
24a10 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
24a20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
24a30 44 45 58 45 44 29 21 3d 30 20 0a 20 20 20 20 20  DEXED)!=0 .     
24a40 20 26 26 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   && pLevel->plan
24a50 2e 75 2e 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .u.pIdx->aSortOr
24a60 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a  der[iEq].    ){.
24a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24a80 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  iEq==0 );.      
24a90 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 70  testcase( iEq==p
24aa0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
24ab0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 20 29 3b  dx->nColumn-1 );
24ac0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24ad0 20 69 45 71 3e 30 20 26 26 20 69 45 71 2b 31 3c   iEq>0 && iEq+1<
24ae0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
24af0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
24b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24b10 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
24b20 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
24b30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  }.    assert( pX
24b40 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
24b50 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
24b60 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  t;.    eType = s
24b70 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
24b80 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29  x(pParse, pX, 0)
24b90 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
24ba0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
24bb0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65  DESC ){.      te
24bc0 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
24bd0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
24be0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  ev;.    }.    iT
24bf0 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
24c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24c10 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
24c20 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
24c30 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
24c40 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
24c50 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24c60 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
24c70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
24c80 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
24c90 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
24ca0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
24cb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
24cc0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
24cd0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
24ce0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
24cf0 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
24d00 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
24d10 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
24d20 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
24d30 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
24d60 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
24d70 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
24d80 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
24d90 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
24da0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
24db0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
24dc0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
24dd0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
24de0 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
24df0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
24e00 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
24e10 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
24e20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
24e30 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
24e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
24e50 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
24e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24e70 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
24e80 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
24e90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
24ea0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
24eb0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
24ec0 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
24ed0 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
24ee0 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
24ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24f00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
24f10 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
24f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
24f30 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
24f40 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
24f50 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
24f60 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
24f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
24f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24f90 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24fa0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
24fb0 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
24fc0 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
24fd0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  index..**.** For
24fe0 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
24ff0 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
25000 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
25010 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
25020 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
25030 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
25040 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
25050 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
25060 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
25070 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
25080 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
25090 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
250a0 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
250b0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
250c0 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
250d0 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
250e0 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
250f0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
25100 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
25110 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
25120 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
25130 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
25140 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
25150 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
25160 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
25170 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
25180 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
25190 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
251a0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
251b0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
251c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
251d0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
251e0 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
251f0 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
25200 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
25210 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
25220 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
25230 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
25240 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
25250 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
25260 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
25270 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
25280 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
25290 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
252a0 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
252b0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
252c0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
252d0 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
252e0 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
252f0 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
25300 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
25310 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
25320 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68   memory cell. Th
25330 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
25340 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
25350 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
25360 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73  memory cell to s
25370 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
25380 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
25390 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
253a0 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
253b0 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
253c0 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
253d0 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
253e0 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
253f0 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
25400 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
25410 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
25420 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
25430 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
25440 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
25450 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
25460 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
25470 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
25480 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
25490 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
254a0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
254b0 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
254c0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
254d0 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
254e0 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
254f0 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
25500 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
25510 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
25520 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
25530 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
25540 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
25550 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
25560 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
25570 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
25580 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
25590 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
255a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
255b0 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
255c0 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
255d0 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
255e0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
255f0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
25600 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
25610 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
25620 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
25630 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
25640 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25650 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
25660 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
25670 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
25680 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
25690 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
256a0 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
256b0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
256c0 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
256d0 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
256e0 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
256f0 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
25700 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
25710 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
25720 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
25730 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
25740 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
25750 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
25760 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25770 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
25780 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
25790 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
257a0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
257b0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
257c0 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
257d0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
257e0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
257f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
25800 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
25810 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
25820 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
25830 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
25840 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
25850 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
25860 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
25870 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
25880 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
25890 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
258a0 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
258b0 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
258c0 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
258d0 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
258e0 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
258f0 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20  >plan.nEq;   /* 
25900 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
25910 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
25920 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
25930 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25940 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
25950 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
25960 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
25970 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25990 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
259a0 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
259b0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
259c0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
259d0 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
259e0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
259f0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
25a00 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
25a10 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
25a20 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
25a30 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
25a60 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
25a70 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
25a80 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
25a90 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
25aa0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
25ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25ac0 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
25ad0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
25ae0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
25b10 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
25b20 0a 20 20 69 6e 74 20 65 71 46 6c 61 67 73 3b 20  .  int eqFlags; 
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b40 20 2f 2a 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 20   /* WO_EQ|WO_IN 
25b50 61 6e 64 20 6d 61 79 62 65 20 61 6c 73 6f 20 57  and maybe also W
25b60 4f 5f 49 53 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 2f  O_ISNULL */..  /
25b70 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
25b80 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
25b90 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
25ba0 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
25bb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
25bc0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25bd0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
25be0 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
25bf0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
25c00 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
25c10 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
25c20 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
25c30 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
25c40 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
25c50 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
25c60 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
25c70 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
25c80 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
25c90 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
25ca0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
25cb0 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
25cc0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
25cd0 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
25ce0 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
25cf0 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
25d00 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
25d10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25d20 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
25d30 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
25d40 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
25d50 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
25d60 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
25d70 6e 45 71 20 29 3b 0a 20 20 65 71 46 6c 61 67 73  nEq );.  eqFlags
25d80 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
25d90 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4e  .wsFlags&WHERE_N
25da0 55 4c 4c 5f 4f 4b 29 20 3f 20 28 57 4f 5f 45 51  ULL_OK) ? (WO_EQ
25db0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
25dc0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 20 20 20 3a 20 28 57 4f 5f 45 51 7c 57 4f 5f 49     : (WO_EQ|WO_I
25e00 4e 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  N);.  for(j=0; j
25e10 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
25e20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20  int r1;.    int 
25e30 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
25e40 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d  mn[j];.    pTerm
25e50 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
25e60 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
25e70 64 79 2c 20 65 71 46 6c 61 67 73 2c 20 70 49 64  dy, eqFlags, pId
25e80 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  x);.    if( pTer
25e90 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
25ea0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
25eb0 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  ng true for indi
25ec0 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
25ed0 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
25ee0 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
25ef0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
25f00 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
25f10 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
25f20 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
25f30 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
25f40 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
25f50 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
25f60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
25f70 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
25f80 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
25f90 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
25fa0 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63  62 */.    r1 = c
25fb0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
25fc0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
25fd0 4c 65 76 65 6c 2c 20 6a 2c 20 72 65 67 42 61 73  Level, j, regBas
25fe0 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
25ff0 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
26000 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
26010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26020 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26030 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
26040 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
26050 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
26060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
26070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26080 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
26090 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
260a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
260b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
260c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
260d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
260e0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
260f0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
26100 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
26110 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
26120 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
26130 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
26140 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
26150 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
26160 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
26170 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
26180 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
26190 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
261a0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
261b0 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
261c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
261d0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
261e0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
261f0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
26200 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
26210 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
26220 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
26230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26240 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
26250 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
26260 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
26270 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
26280 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
26290 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
262a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
262b0 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
262c0 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
262d0 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
262e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
262f0 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
26300 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
26310 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
26320 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
26330 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
26340 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
26350 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
26360 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
26370 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
26380 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
26390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
263a0 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
263b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
263c0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
263d0 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
263e0 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
263f0 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
26400 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
26410 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
26420 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
26430 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
26440 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
26450 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
26460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26470 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
26480 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
26490 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
264b0 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
264c0 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
264d0 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
264e0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
264f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
26500 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
26510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
26520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
26530 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
26540 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
26550 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
26560 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
26570 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
26580 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
26590 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
265a0 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
265b0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
265c0 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
265d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
265e0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
265f0 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
26600 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
26610 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
26620 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
26630 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
26640 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
26650 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
26660 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
26670 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
26680 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
26690 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
266a0 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
266b0 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
266c0 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
266d0 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
266e0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
266f0 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
26700 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
26710 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
26720 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
26730 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
26740 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
26750 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
26760 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
26770 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
26780 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
26790 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
267a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
267b0 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
267c0 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
267d0 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
267e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
267f0 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
26800 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
26810 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
26820 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
26830 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
26840 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
26850 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
26860 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
26870 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
26880 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
26890 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
268a0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
268b0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
268c0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62  Loop *pLoop, Tab
268d0 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
268e0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f  ex *pIndex = pLo
268f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
26900 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
26910 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
26920 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Eq;.  int i, j;.
26930 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d    Column *aCol =
26940 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69   pTab->aCol;.  i
26950 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70  nt *aiColumn = p
26960 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b  Index->aiColumn;
26970 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b  .  StrAccum txt;
26980 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ..  if( pIndex==
26990 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
269a0 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
269b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
269c0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
269d0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
269e0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
269f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
26a00 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
26a10 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
26a20 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
26a30 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
26a40 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
26a50 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
26a60 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
26a70 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
26a80 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
26a90 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61  dTerm(&txt, i, a
26aa0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
26ab0 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20  .zName, "=");.  
26ac0 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
26ad0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
26ae0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
26af0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
26b00 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  = (j==pIndex->nC
26b10 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64  olumn ) ? "rowid
26b20 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
26b30 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
26b40 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
26b50 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c  rm(&txt, i++, z,
26b60 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28   ">");.  }.  if(
26b70 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
26b80 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
26b90 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
26ba0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
26bb0 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
26bc0 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
26bd0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
26be0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
26bf0 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c  m(&txt, i, z, "<
26c00 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
26c10 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
26c20 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
26c30 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
26c40 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74  trAccumFinish(&t
26c50 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
26c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26c70 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
26c80 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
26c90 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
26ca0 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
26cb0 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72  and. If the quer
26cc0 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  y being compiled
26cd0 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51   is an EXPLAIN Q
26ce0 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e  UERY PLAN, a sin
26cf0 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  gle.** record is
26d00 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
26d10 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
26d20 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
26d30 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20  strategy in .** 
26d40 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  pLevel..*/.stati
26d50 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
26d60 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  eScan(.  Parse *
26d70 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
26d80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
26d90 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  e context */.  S
26da0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
26db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26dc0 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69  * Table list thi
26dd0 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f  s loop refers to
26de0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
26df0 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20   *pLevel,       
26e00 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f        /* Scan to
26e10 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69   write OP_Explai
26e20 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a  n opcode for */.
26e30 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
26e60 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66  level" column of
26e70 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
26e80 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ea0 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22  Value for "from"
26eb0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
26ec0 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  t */.  u16 wctrl
26ed0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
26ee0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
26ef0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
26f00 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
26f10 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
26f20 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
26f30 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
26f40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
26f50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
26f60 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
26f70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26f80 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
26f90 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
26fa0 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
26fb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
26fc0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
26fd0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
26fe0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
26ff0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
27000 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
27010 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
27020 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
27030 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20  _int64 nRow;    
27040 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
27050 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
27060 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61  s visited by sca
27070 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  n */.    int iId
27080 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
27090 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
270a0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
270b0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
270c0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
270d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
270e0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
270f0 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
27100 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
27110 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
27120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27130 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
27140 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
27150 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
27160 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
27170 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
27180 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
27190 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  is loop */..    
271a0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
271b0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67  pWLoop;.    flag
271c0 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
271d0 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  gs;.    if( (fla
271e0 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
271f0 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
27200 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
27210 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
27220 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
27230 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
27240 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
27250 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
27260 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
27270 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55  lags&WHERE_VIRTU
27280 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28  ALTABLE)==0 && (
27290 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
272a0 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20  Eq>0)).         
272b0 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
272c0 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
272d0 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
272e0 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
272f0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
27300 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
27310 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
27320 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
27330 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
27340 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
27350 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
27360 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
27370 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
27380 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
27390 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
273a0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
273b0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
273c0 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
273d0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
273e0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
273f0 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
27400 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
27410 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
27420 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
27430 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
27440 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
27450 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
27460 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
27470 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
27480 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20  UALTABLE))==0.  
27490 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
274a0 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20  tree.pIndex!=0. 
274b0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
274c0 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
274d0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
274e0 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70   pLoop, pItem->p
274f0 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
27500 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27510 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
27520 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58   USING %s%sINDEX
27530 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a  %s%s%s", zMsg, .
27540 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
27550 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
27560 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43  NDEX)?"AUTOMATIC
27570 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
27580 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
27590 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56  E_IDX_ONLY)?"COV
275a0 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20  ERING ":""),.   
275b0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
275c0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
275d0 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20  X)?"":" "),.    
275e0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
275f0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
27600 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e 75 2e 62  )?"": pLoop->u.b
27610 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
27620 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  me),.          z
27630 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  Where.      );. 
27640 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
27650 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a  ee(db, zWhere);.
27660 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
27670 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
27680 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26  )!=0 && (flags &
27690 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
276a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
276b0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
276c0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
276d0 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
276e0 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
276f0 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
27700 6c 61 67 73 26 57 48 45 52 45 5f 43 4f 4c 55 4d  lags&WHERE_COLUM
27710 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  N_EQ ){.        
27720 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
27730 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
27740 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
27750 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
27760 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
27770 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
27780 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
27790 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
277a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
277b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
277c0 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
277d0 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
277e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
277f0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
27800 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
27810 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
27820 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
27830 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
27840 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
27850 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
27860 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
27870 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
27880 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27890 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
278a0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
278b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
278c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
278d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
278e0 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
278f0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
27900 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
27910 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
27920 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
27930 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
27940 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
27950 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
27980 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
27990 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
279a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
279b0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28  if( wctrlFlags&(
279c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
279d0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
279e0 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65  MAX) ){.      te
279f0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
27a00 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
27a10 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20  BY_MIN );.      
27a20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65  nRow = 1;.    }e
27a30 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  lse{.      nRow 
27a40 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
27a50 29 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  )pLoop->nOut;.  
27a60 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
27a70 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
27a80 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
27a90 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
27aa0 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
27ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27ac0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
27ad0 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
27ae0 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
27af0 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
27b00 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
27b10 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
27b20 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
27b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
27b40 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
27b50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
27b60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
27b70 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
27b80 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
27b90 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
27ba0 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
27bb0 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
27bc0 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
27bd0 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
27be0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
27bf0 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
27c00 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
27c10 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
27c20 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
27c30 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
27c40 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
27c50 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
27c60 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
27c70 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
27c80 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
27c90 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
27ca0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
27cb0 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
27cc0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
27cd0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
27ce0 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
27cf0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
27d00 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
27d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
27d20 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
27d30 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
27d40 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
27d50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
27d60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
27d70 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
27d80 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
27d90 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
27da0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
27db0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
27dc0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
27dd0 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
27de0 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
27df0 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
27e00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e10 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
27e20 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
27e30 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
27e40 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
27e50 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
27e60 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
27e70 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
27e80 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
27e90 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
27ea0 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
27eb0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
27ec0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
27ed0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
27ee0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
27ef0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
27f00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27f10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
27f20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
27f30 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
27f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27f50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
27f60 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
27f70 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
27f80 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27f90 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
27fa0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
27fb0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
27fc0 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27fe0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
27ff0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
28000 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
28010 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
28020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
28030 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
28040 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
28050 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
28060 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
28070 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
28080 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
28090 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
280a0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
280b0 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
280c0 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
280d0 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
280e0 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20  e returning */. 
280f0 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52   Bitmask newNotR
28100 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65  eady;      /* Re
28110 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
28120 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
28130 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
28140 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28150 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
28160 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
28170 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
28180 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
28190 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
281a0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
281b0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
281c0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
281d0 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
281e0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
281f0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
28200 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
28210 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
28220 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28230 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
28240 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
28250 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28260 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
28270 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
28280 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a  ent((v, "Begin J
28290 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c  oin Loop %d", iL
282a0 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72  evel));..  /* Cr
282b0 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
282c0 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
282d0 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
282e0 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
282f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
28300 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
28310 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
28320 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
28330 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
28340 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
28350 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
28360 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
28370 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
28380 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
28390 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
283a0 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
283b0 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
283c0 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
283d0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
283e0 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
283f0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
28400 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
28410 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
28420 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
28430 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
28440 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
28450 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
28460 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
28470 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
28480 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
28490 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
284a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
284b0 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
284c0 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
284d0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
284e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
284f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
28500 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
28510 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
28520 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
28530 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
28540 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
28550 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
28560 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
28570 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
28580 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
28590 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
285a0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
285b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
285c0 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
285d0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
285e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
285f0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
28600 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
28610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
28630 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
28640 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
28650 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28660 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
28670 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
28680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
28690 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52  ial case of a FR
286a0 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM clause subque
286b0 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ry implemented a
286c0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  s a co-routine *
286d0 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  /.  if( pTabItem
286e0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  ->viaCoroutine )
286f0 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
28700 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
28710 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  egReturn;.    sq
28720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28730 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
28740 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
28750 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64  lSub-1, regYield
28760 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
28770 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
28780 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
28790 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ld, regYield);. 
287a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
287b0 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
287c0 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20  co-routine %s", 
287d0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
287e0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
287f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28800 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c  , OP_If, regYiel
28810 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  d+1, addrBrk);. 
28820 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
28830 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65  OP_Goto;.  }else
28840 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28850 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
28860 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65  LE.  if(  (pLeve
28870 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
28880 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
28890 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
288a0 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
288b0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
288c0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
288d0 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
288e0 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
288f0 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
28900 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
28910 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
28920 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
28930 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
28940 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
28950 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
28960 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61  index_info *pVta
28970 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  bIdx = pLevel->p
28980 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a  lan.u.pVtabIdx;.
28990 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
289a0 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e  int = pVtabIdx->
289b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  nConstraint;.   
289c0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
289d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
289e0 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d  _usage *aUsage =
289f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
28a30 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20  traintUsage;.   
28a40 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
28a50 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
28a60 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
28a70 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
28ab0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
28ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28ad0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
28ae0 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
28af0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
28b00 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
28b10 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
28b20 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
28b30 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
28b40 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
28b50 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
28b60 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
28b70 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
28b80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
28b90 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
28ba0 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
28bb0 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20    int iTarget = 
28bc0 69 52 65 67 2b 6a 2b 31 3b 0a 20 20 20 20 20 20  iReg+j+1;.      
28bd0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
28be0 2d 3e 61 5b 61 43 6f 6e 73 74 72 61 69 6e 74 5b  ->a[aConstraint[
28bf0 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b  k].iTermOffset];
28c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
28c10 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28c20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
28c30 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
28c40 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
28c50 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6b  pTerm, pLevel, k
28c60 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
28c70 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46          addrNotF
28c80 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
28c90 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 20 20  ddrNxt;.        
28ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28cc0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
28cd0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
28ce0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
28cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
28d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28d20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72    if( k==nConstr
28d30 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
28d40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28d50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28d60 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64  Integer, pVtabId
28d70 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  x->idxNum, iReg)
28d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28d90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
28da0 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67  teger, j-1, iReg
28db0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
28dc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28dd0 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
28de0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
28df0 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  eg, pVtabIdx->id
28e00 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
28e10 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
28e20 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
28e30 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49  IdxStr ? P4_MPRI
28e40 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
28e50 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e  ;.    pVtabIdx->
28e60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
28e70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
28e80 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
28e90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
28ea0 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  ( aUsage[j].omit
28eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
28ec0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
28ed0 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  int[j].iTermOffs
28ee0 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  et;.        disa
28ef0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
28f00 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b  &pWC->a[iTerm]);
28f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28f20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
28f30 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
28f40 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
28f50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
28f60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
28f70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
28f80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28f90 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
28fa0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
28fb0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
28fc0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
28fd0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
28fe0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
28ff0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29000 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
29010 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
29020 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
29030 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20  ID_EQ ){.    /* 
29040 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
29050 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
29060 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
29070 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
29080 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
29090 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
290a0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
290b0 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
290c0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
290d0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
290e0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
290f0 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
29100 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
29110 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
29120 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
29130 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
29140 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
29150 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
29160 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
29170 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
29180 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
29190 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
291a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
291b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
291c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
291d0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
291e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
291f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
29200 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
29210 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
29220 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64  62 */.    iRowid
29230 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
29240 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
29250 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
29260 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
29270 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
29280 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
29290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
292a0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
292b0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
292c0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
292d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
292e0 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
292f0 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
29300 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
29310 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29320 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
29330 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67  Parse, iRowidReg
29340 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
29350 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
29360 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
29370 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
29380 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
29390 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
293a0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
293b0 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
293c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
293d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
293e0 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
293f0 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
29400 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
29410 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
29420 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
29430 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
29440 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
29450 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
29460 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
29470 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
29480 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
29490 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
294a0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
294b0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
294c0 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
294d0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
294e0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
294f0 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
29500 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
29510 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
29520 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
29530 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
29540 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
29550 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
29560 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
29570 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
29580 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
29590 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
295a0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
295b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
295c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
295d0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
295e0 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
295f0 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
29600 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
29610 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
29620 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
29630 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
29640 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
29650 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
29660 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
29670 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
29680 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
29690 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
296a0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
296b0 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
296c0 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
296d0 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
296e0 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
296f0 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
29700 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
29710 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
29720 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
29730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
29740 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
29750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
29760 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
29770 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
29780 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
29790 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
297a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
297b0 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
297c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
297d0 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
297e0 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
297f0 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
29800 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
29810 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
29820 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
29830 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
29840 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
29850 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
29860 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
29870 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
29880 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
29890 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
298a0 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
298b0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
298c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
298d0 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
298e0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
298f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
29900 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
29910 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
29920 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
29930 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
29940 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
29950 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
29960 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
29970 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29980 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
29990 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
299a0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
299b0 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
299c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
299d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
299e0 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
299f0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
29a00 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
29a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29a30 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
29a40 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
29a50 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
29a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29a70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
29a80 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
29a90 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
29aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
29ab0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
29ac0 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
29ad0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
29ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
29af0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
29b00 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
29b10 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
29b20 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
29b30 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
29b40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
29b50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
29b60 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
29b70 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
29b80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
29b90 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
29ba0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
29bb0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
29bc0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
29bd0 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
29be0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
29bf0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
29c00 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
29c10 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
29c20 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
29c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
29c40 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
29c50 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
29c60 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
29c70 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
29c80 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
29c90 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
29ca0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
29cb0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
29cc0 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
29cd0 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
29ce0 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
29cf0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
29d00 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
29d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
29d20 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
29d30 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
29d40 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
29d50 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
29d60 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
29d70 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
29d80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
29d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
29db0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
29dc0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
29dd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29de0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
29df0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
29e00 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
29e10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
29e20 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
29e30 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
29e40 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
29e50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
29e60 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
29e70 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
29e80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
29e90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29ea0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
29eb0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
29ec0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
29ed0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
29ee0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
29ef0 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
29f00 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
29f10 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
29f20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
29f30 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
29f40 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
29f50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
29f60 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
29f70 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
29f80 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
29f90 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
29fa0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
29fb0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
29fc0 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
29fd0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
29fe0 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
29ff0 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
2a000 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
2a010 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
2a020 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
2a030 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
2a040 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
2a050 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
2a060 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
2a070 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2a080 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
2a090 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
2a0a0 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
2a0b0 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
2a0c0 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
2a0d0 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
2a0e0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
2a0f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2a100 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
2a110 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
2a120 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
2a130 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
2a140 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
2a150 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
2a160 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
2a170 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
2a180 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
2a190 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
2a1a0 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
2a1b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
2a1c0 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
2a1d0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
2a1e0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
2a1f0 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
2a200 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
2a210 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
2a220 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2a230 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
2a240 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
2a250 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
2a260 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
2a270 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
2a280 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
2a290 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2a2a0 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
2a2b0 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
2a2c0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
2a2d0 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
2a2e0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
2a2f0 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
2a300 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
2a310 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
2a320 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
2a330 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2a340 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
2a350 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
2a360 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
2a370 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
2a380 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
2a390 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
2a3a0 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
2a3b0 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
2a3c0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
2a3d0 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
2a3e0 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
2a3f0 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
2a400 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
2a410 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2a420 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
2a430 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
2a440 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
2a450 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
2a460 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
2a470 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
2a480 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
2a490 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4b0 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
2a4c0 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
2a4d0 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
2a4e0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
2a4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
2a500 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
2a510 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
2a520 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
2a530 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
2a540 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
2a550 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
2a560 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
2a570 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
2a580 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
2a590 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
2a5a0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
2a5b0 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
2a5c0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
2a5d0 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
2a5e0 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
2a5f0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
2a600 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
2a610 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
2a620 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2a630 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
2a640 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
2a650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
2a660 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
2a670 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
2a680 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
2a690 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
2a6a0 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
2a6b0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
2a6c0 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
2a6d0 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
2a6e0 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
2a6f0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
2a700 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
2a710 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
2a720 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
2a730 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
2a740 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
2a750 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
2a760 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
2a770 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
2a780 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
2a790 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
2a7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
2a7b0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
2a7c0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
2a7d0 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
2a7e0 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
2a7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2a800 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
2a810 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
2a820 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
2a830 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
2a840 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
2a850 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
2a860 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
2a870 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
2a880 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2a890 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
2a8a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
2a8b0 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
2a8c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a8d0 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
2a8e0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
2a8f0 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
2a920 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
2a930 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
2a940 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
2a950 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
2a960 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
2a970 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
2a980 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
2a990 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
2a9a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2a9b0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
2a9c0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
2a9d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2a9e0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2a9f0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
2aa00 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
2aa10 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
2aa20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
2aa30 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
2aa40 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
2aa50 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
2aa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2aa70 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
2aa80 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
2aa90 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
2aac0 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
2aad0 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aaf0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
2ab00 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
2ab10 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
2ab20 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
2ab30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
2ab40 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
2ab50 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
2ab60 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
2ab70 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
2ab80 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
2ab90 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
2aba0 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28 6e  xCur;.    k = (n
2abb0 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Eq==pIdx->nColum
2abc0 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e 61  n ? -1 : pIdx->a
2abd0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a  iColumn[nEq]);..
2abe0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
2abf0 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
2ac00 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
2ac10 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
2ac20 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
2ac30 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2ac40 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
2ac50 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
2ac60 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
2ac70 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
2ac80 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
2ac90 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
2aca0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
2acb0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
2acc0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
2acd0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
2ace0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
2acf0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
2ad00 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
2ad10 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
2ad20 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
2ad30 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
2ad40 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
2ad50 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
2ad60 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
2ad70 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
2ad80 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
2ad90 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
2ada0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
2adb0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
2adc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2add0 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
2ade0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2adf0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45  ags&WHERE_ORDERE
2ae00 44 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  D).     && (pIdx
2ae10 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
2ae20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
2ae30 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
2ae40 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
2ae50 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
2ae60 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
2ae70 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
2ae80 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
2ae90 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
2aea0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
2aeb0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
2aec0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
2aed0 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
2aee0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
2aef0 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
2af00 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
2af10 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
2af20 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
2af30 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2af40 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2af50 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
2af60 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
2af70 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
2af80 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
2af90 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
2afa0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
2afb0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
2afc0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
2afd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2afe0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
2aff0 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
2b000 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
2b010 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
2b020 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
2b030 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
2b040 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
2b050 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
2b060 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b070 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
2b080 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
2b090 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
2b0a0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
2b0b0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
2b0c0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
2b0d0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
2b0e0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
2b0f0 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
2b100 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
2b110 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
2b120 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
2b130 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
2b140 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
2b150 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
2b160 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
2b170 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
2b180 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
2b190 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
2b1a0 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
2b1b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
2b1c0 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
2b1d0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
2b1e0 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
2b1f0 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
2b200 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
2b210 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
2b220 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
2b230 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
2b240 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
2b250 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
2b260 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
2b270 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
2b280 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
2b290 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
2b2a0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
2b2b0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
2b2c0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
2b2d0 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
2b2e0 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
2b2f0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
2b300 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
2b310 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
2b320 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
2b330 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
2b340 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
2b350 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
2b360 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
2b370 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
2b380 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
2b390 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
2b3a0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
2b3b0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
2b3c0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
2b3d0 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
2b3e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2b3f0 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
2b400 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
2b410 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
2b420 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
2b430 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
2b440 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
2b450 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
2b460 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
2b470 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
2b480 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
2b490 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
2b4a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
2b4b0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
2b4c0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
2b4d0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
2b4e0 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
2b4f0 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
2b500 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
2b510 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
2b520 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
2b530 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
2b540 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
2b550 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
2b560 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
2b570 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
2b580 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2b590 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2b5a0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
2b5b0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
2b5c0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
2b5d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
2b5e0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
2b5f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2b600 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
2b610 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
2b620 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
2b630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b640 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
2b650 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b660 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2b670 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
2b680 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
2b690 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
2b6a0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
2b6b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
2b6c0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
2b6d0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
2b6e0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
2b6f0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
2b700 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
2b710 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
2b720 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
2b730 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
2b740 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
2b750 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
2b760 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
2b770 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
2b780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b790 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2b7a0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
2b7b0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
2b7c0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
2b7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
2b7e0 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
2b7f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
2b800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b810 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
2b820 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
2b830 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
2b840 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
2b850 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
2b860 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
2b870 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
2b880 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
2b890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b8a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b8b0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
2b8c0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
2b8d0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
2b8e0 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
2b8f0 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
2b900 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
2b910 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
2b920 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
2b930 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
2b940 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
2b950 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
2b960 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
2b970 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
2b980 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
2b990 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
2b9a0 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
2b9b0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
2b9c0 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
2b9d0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
2b9e0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
2b9f0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
2ba00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2ba10 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
2ba20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2ba30 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
2ba40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2ba50 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
2ba60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ba70 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
2ba80 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
2ba90 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
2baa0 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
2bab0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
2bac0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
2bad0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
2bae0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2baf0 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
2bb00 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
2bb10 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
2bb20 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
2bb30 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
2bb40 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
2bb50 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
2bb60 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
2bb70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2bb80 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
2bb90 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
2bba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2bbb0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
2bbc0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
2bbd0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
2bbe0 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
2bbf0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
2bc00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2bc10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
2bc20 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
2bc30 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
2bc40 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
2bc50 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
2bc60 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
2bc70 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
2bc80 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
2bc90 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
2bca0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
2bcb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2bcc0 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
2bcd0 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
2bce0 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
2bcf0 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
2bd00 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
2bd10 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
2bd20 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
2bd30 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
2bd40 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
2bd50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
2bd60 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
2bd70 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
2bd80 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
2bd90 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
2bda0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2bdb0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
2bdc0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
2bdd0 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
2bde0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
2bdf0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
2be00 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
2be10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2be20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
2be30 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
2be40 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
2be50 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
2be60 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
2be70 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
2be80 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
2be90 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
2bea0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
2beb0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
2bec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2bed0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
2bee0 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
2bef0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2bf00 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
2bf10 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
2bf20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
2bf30 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
2bf40 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
2bf50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2bf60 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
2bf70 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
2bf80 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
2bf90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
2bfa0 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
2bfb0 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
2bfc0 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
2bfd0 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
2bfe0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
2bff0 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
2c000 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
2c010 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2c020 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
2c030 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
2c040 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
2c050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2c060 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
2c070 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
2c080 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
2c090 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2c0a0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2c0b0 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
2c0c0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
2c0d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
2c0e0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
2c0f0 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
2c100 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
2c110 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
2c120 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
2c130 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
2c140 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
2c150 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
2c160 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
2c170 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
2c180 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
2c190 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
2c1a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2c1b0 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
2c1c0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
2c1d0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2c1e0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
2c1f0 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
2c200 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2c210 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
2c220 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
2c230 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2c240 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
2c250 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
2c260 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20  _LIMIT))!=0 ){. 
2c270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c280 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2c290 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
2c2a0 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  q, r1);.      sq
2c2b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c2c0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
2c2d0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
2c2e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
2c2f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2c300 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f  rse, r1);..    /
2c310 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
2c320 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
2c330 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61  ired */.    disa
2c340 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
2c350 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
2c360 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
2c370 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
2c380 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
2c390 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52  able ){.      iR
2c3a0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
2c3b0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
2c3c0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2c3d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c3e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c3f0 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
2c400 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
2c410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c420 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
2c430 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
2c440 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
2c450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c460 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
2c470 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
2c480 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
2c490 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k */.    }..    
2c4a0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
2c4b0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
2c4c0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2c4d0 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
2c4e0 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
2c4f0 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
2c500 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
2c510 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
2c520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c530 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2c540 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2c550 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  QUE ){.      pLe
2c560 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
2c570 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
2c580 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
2c590 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
2c5a0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
2c5b0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
2c5c0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
2c5d0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
2c5e0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
2c5f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2c600 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2c610 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b 0a 20  _COVER_SCAN ){. 
2c620 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
2c630 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
2c640 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
2c650 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
2c660 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
2c670 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
2c680 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
2c690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c6a0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
2c6b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2c6c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2c6d0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
2c6e0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
2c6f0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
2c700 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
2c710 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
2c720 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
2c730 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
2c740 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
2c750 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
2c760 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
2c770 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
2c780 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
2c790 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
2c7a0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
2c7b0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
2c7c0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
2c7d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
2c7e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2c7f0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
2c800 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
2c810 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
2c820 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
2c830 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
2c840 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
2c850 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
2c860 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
2c870 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
2c880 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
2c890 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2c8a0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2c8c0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
2c8d0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
2c8e0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
2c8f0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
2c900 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
2c910 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
2c920 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
2c930 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
2c940 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
2c950 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
2c960 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
2c970 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
2c980 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
2c990 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
2c9a0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
2c9b0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
2c9c0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
2c9d0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
2c9e0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
2c9f0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
2ca00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2ca10 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2ca20 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
2ca30 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
2ca40 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
2ca50 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
2ca60 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
2ca70 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
2ca80 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
2ca90 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
2caa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2cab0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
2cac0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
2cad0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
2cae0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
2caf0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
2cb00 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
2cb10 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
2cb20 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
2cb30 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
2cb40 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
2cb50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2cb60 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
2cb70 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
2cb80 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
2cb90 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
2cba0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
2cbb0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
2cbc0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
2cbd0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
2cbe0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2cbf0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
2cc00 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
2cc10 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
2cc20 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
2cc30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2cc40 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
2cc50 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
2cc60 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
2cc70 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
2cc80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
2cc90 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
2cca0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
2ccb0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
2ccc0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
2ccd0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
2cce0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
2ccf0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
2cd00 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
2cd10 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
2cd20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
2cd30 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
2cd40 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
2cd50 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
2cd60 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
2cd70 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
2cd80 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
2cd90 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
2cda0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2cdb0 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
2cdc0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
2cdd0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
2cde0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
2cdf0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2ce00 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
2ce10 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
2ce20 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
2ce30 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
2ce40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce60 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
2ce70 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
2ce80 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
2ce90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ceb0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2cec0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
2ced0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
2cee0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2cef0 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
2cf00 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
2cf10 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
2cf20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf40 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
2cf50 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
2cf60 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
2cf70 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
2cf80 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
2cf90 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
2cfa0 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
2cfb0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2cfe0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
2cff0 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d010 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
2d020 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
2d030 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
2d040 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
2d050 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
2d060 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
2d070 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
2d080 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2d090 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
2d0a0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
2d0b0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
2d0c0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
2d0d0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2d0e0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
2d0f0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
2d100 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
2d110 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
2d120 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
2d130 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
2d140 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
2d150 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
2d160 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
2d170 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
2d180 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
2d190 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
2d1a0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
2d1b0 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
2d1c0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
2d1d0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
2d1e0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
2d1f0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2d200 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
2d210 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
2d220 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
2d230 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2d260 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
2d270 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
2d280 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
2d290 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
2d2a0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
2d2b0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
2d2c0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
2d2d0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
2d2e0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
2d2f0 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
2d300 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61  tackAllocRaw(pPa
2d310 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
2d340 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
2d350 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
2d360 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
2d370 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
2d380 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
2d390 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
2d3a0 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52  oc = (i16)(nNotR
2d3b0 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
2d3c0 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
2d3d0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
2d3e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
2d3f0 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
2d400 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
2d410 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
2d420 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
2d430 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
2d440 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
2d450 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
2d460 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
2d470 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
2d480 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
2d490 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
2d4a0 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
2d4b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2d4c0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
2d4d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2d4e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d4f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
2d500 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
2d510 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
2d520 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
2d530 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
2d540 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
2d550 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
2d560 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
2d570 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
2d580 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
2d590 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
2d5a0 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
2d5b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
2d5c0 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
2d5d0 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
2d5e0 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
2d5f0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
2d600 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
2d610 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
2d620 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
2d630 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
2d640 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
2d650 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
2d660 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
2d670 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2d680 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
2d690 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
2d6a0 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
2d6b0 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
2d6c0 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
2d6d0 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
2d6e0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2d6f0 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
2d700 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
2d710 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
2d720 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
2d730 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
2d740 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
2d750 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d760 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
2d770 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  0 ){.      regRo
2d780 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
2d790 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
2d7a0 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
2d7b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2d7c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d7d0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
2d7e0 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  egRowset);.    }
2d7f0 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
2d800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d810 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2d820 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
2d830 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
2d840 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
2d850 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
2d860 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
2d870 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
2d880 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
2d890 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
2d8a0 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
2d8b0 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
2d8c0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
2d8d0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
2d8e0 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
2d8f0 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
2d900 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
2d910 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
2d920 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
2d930 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
2d940 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2d950 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
2d960 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
2d970 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
2d980 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
2d990 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
2d9a0 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
2d9b0 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
2d9c0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
2d9d0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
2d9e0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2d9f0 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
2da00 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
2da10 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
2da20 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
2da30 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
2da40 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
2da50 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
2da60 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
2da70 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
2da80 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
2da90 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
2daa0 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
2dab0 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
2dac0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
2dad0 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
2dae0 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
2daf0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
2db00 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
2db10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2db20 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
2db30 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
2db40 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
2db50 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
2db60 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
2db70 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
2db80 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
2db90 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
2dba0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2dbb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2dbc0 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
2dbd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2dbe0 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
2dbf0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2dc00 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49  VIRTUAL|TERM_ORI
2dc10 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
2dc20 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
2dc30 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
2dc40 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
2dc50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2dc60 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2dc70 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
2dc80 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
2dc90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
2dca0 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
2dcb0 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2dcc0 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
2dcd0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2dce0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
2dcf0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
2dd00 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2dd10 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
2dd20 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
2dd30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2dd40 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
2dd50 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
2dd60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
2dd70 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2dd80 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
2dd90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
2dda0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
2ddb0 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
2ddc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2ddd0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
2dde0 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
2ddf0 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
2de00 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
2de10 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
2de20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
2de30 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
2de40 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  pOrTerm->pExpr;.
2de50 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
2de60 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73  Expr && !ExprHas
2de70 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72  Property(pOrExpr
2de80 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2de90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
2dea0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
2deb0 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
2dec0 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
2ded0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
2dee0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
2def0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
2df00 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
2df10 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
2df20 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
2df30 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2df40 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2df50 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
2df60 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
2df80 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
2df90 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f  OSE | WHERE_AND_
2dfa0 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20  ONLY |.         
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
2dfc0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
2dfd0 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
2dfe0 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29  E_ONLY, iCovCur)
2dff0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e000 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
2e010 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2e020 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2e030 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
2e040 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
2e050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
2e060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ereLevel *pLvl;.
2e070 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
2e080 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
2e090 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2e0a0 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
2e0b0 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
2e0c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
2e0d0 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
2e0e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2e0f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e100 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
2e110 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e120 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
2e130 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
2e140 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
2e150 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
2e160 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
2e170 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
2e180 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
2e190 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
2e1a0 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
2e1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2e1f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2e200 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
2e210 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
2e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e240 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e250 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
2e260 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
2e270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2e280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e290 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2e2a0 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
2e2b0 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
2e2c0 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
2e2d0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
2e2e0 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
2e2f0 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
2e300 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2e310 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
2e320 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
2e330 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
2e340 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
2e350 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2e360 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
2e370 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
2e380 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
2e390 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
2e3a0 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
2e3b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
2e3c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2e3d0 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
2e3e0 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
2e3f0 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
2e400 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
2e410 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
2e420 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
2e430 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
2e440 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
2e450 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
2e460 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
2e470 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2e480 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
2e490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
2e4a0 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
2e4b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2e4c0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
2e4d0 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
2e4e0 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
2e4f0 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
2e500 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
2e510 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
2e520 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e530 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
2e540 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2e550 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
2e560 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
2e570 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2e580 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
2e590 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
2e5a0 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
2e5b0 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
2e5c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
2e5d0 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
2e5e0 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
2e5f0 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
2e600 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
2e610 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
2e620 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
2e630 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
2e640 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
2e650 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
2e660 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
2e670 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
2e680 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
2e690 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
2e6a0 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
2e6b0 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
2e6c0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
2e6d0 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 20  .          pLvl 
2e6e0 3d 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  = &pSubWInfo->a[
2e6f0 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0];.          if
2e700 28 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73  ( (pLvl->plan.ws
2e710 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2e720 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
2e730 20 20 20 20 20 26 26 20 28 70 4c 76 6c 2d 3e 70       && (pLvl->p
2e740 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e750 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d  ERE_TEMP_INDEX)=
2e760 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2e770 20 28 69 69 3d 3d 30 20 7c 7c 20 70 4c 76 6c 2d   (ii==0 || pLvl-
2e780 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 43  >plan.u.pIdx==pC
2e790 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
2e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2e7b0 65 72 74 28 20 70 4c 76 6c 2d 3e 69 49 64 78 43  ert( pLvl->iIdxC
2e7c0 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
2e7d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
2e7e0 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  = pLvl->plan.u.p
2e7f0 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
2e800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e810 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
2e820 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2e830 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
2e840 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
2e850 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
2e860 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
2e870 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
2e880 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2e890 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
2e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e8b0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
2e8c0 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
2e8d0 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76  ov;.    if( pCov
2e8e0 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   ) pLevel->iIdxC
2e8f0 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20  ur = iCovCur;.  
2e900 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
2e910 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72  {.      pAndExpr
2e920 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
2e930 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2e940 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
2e950 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
2e960 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2e970 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65  eChangeP1(v, iRe
2e980 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64  tInit, sqlite3Vd
2e990 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2e9a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2e9b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2e9c0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
2e9d0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
2e9e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2e9f0 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
2ea00 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
2ea10 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
2ea20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
2ea30 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  e(pParse->db, pO
2ea40 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21  rTab);.    if( !
2ea50 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
2ea60 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
2ea70 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65  el, pTerm);.  }e
2ea80 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
2ea90 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
2eaa0 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
2eab0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
2eac0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
2ead0 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
2eae0 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
2eaf0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2eb00 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
2eb10 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
2eb20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
2eb30 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20  onst u8 aStep[] 
2eb40 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  = { OP_Next, OP_
2eb50 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74  Prev };.    stat
2eb60 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
2eb70 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69  rt[] = { OP_Rewi
2eb80 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20  nd, OP_Last };. 
2eb90 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
2eba0 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b  =0 || bRev==1 );
2ebb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
2ebc0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
2ebd0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
2ebe0 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70  tep[bRev];.    p
2ebf0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
2ec00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
2ec10 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
2ec20 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
2ec30 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
2ec40 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
2ec50 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
2ec60 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
2ec70 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a  LSCAN_STEP;.  }.
2ec80 20 20 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d 20    newNotReady = 
2ec90 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
2eca0 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
2ecb0 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20  t, iCur);..  /* 
2ecc0 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
2ecd0 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
2ece0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
2ecf0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
2ed00 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
2ed10 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
2ed20 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
2ed30 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
2ed40 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35  TATION-OF: R-495
2ed50 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74  25-50935 Terms t
2ed60 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61  hat cannot be sa
2ed70 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a  tisfied through.
2ed80 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
2ed90 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74  indices become t
2eda0 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76  ests that are ev
2edb0 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20  aluated against 
2edc0 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a  each row of.  **
2edd0 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e   the relevant in
2ede0 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  put tables..  */
2edf0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
2ee00 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
2ee10 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
2ee20 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
2ee30 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73  *pE;.    testcas
2ee40 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
2ee50 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2ee60 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30   ); /* IMP: R-30
2ee70 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
2ee80 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
2ee90 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2eea0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
2eeb0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2eec0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
2eed0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
2eee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2eef0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
2ef00 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79  ll & newNotReady
2ef10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
2ef20 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
2ef30 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
2ef40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ef50 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2ef60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2ef70 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
2ef80 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
2ef90 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
2efa0 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
2efb0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
2efc0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
2efd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
2efe0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
2eff0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
2f000 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
2f010 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
2f020 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
2f030 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2f040 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2f050 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
2f060 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
2f070 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2f080 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
2f090 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
2f0a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
2f0b0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
2f0c0 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
2f0d0 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
2f0e0 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
2f0f0 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
2f100 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
2f110 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
2f120 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2f130 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
2f140 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
2f150 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
2f160 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
2f170 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
2f180 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
2f190 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
2f1a0 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
2f1b0 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
2f1c0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
2f1d0 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
2f1e0 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
2f1f0 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
2f200 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
2f210 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
2f220 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
2f230 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
2f240 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
2f250 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
2f260 6c 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45 71  lt;.    Expr sEq
2f270 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2f280 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
2f290 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
2f2a0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
2f2b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
2f2c0 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
2f2d0 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
2f2e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2f2f0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
2f300 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
2f310 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
2f320 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
2f330 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f340 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
2f350 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
2f360 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
2f370 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 65  prereqRight & ne
2f380 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b  wNotReady)!=0 );
2f390 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64  .    pAlt = find
2f3a0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
2f3b0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2f3c0 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  umn, notReady, W
2f3d0 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
2f3e0 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20      if( pAlt==0 
2f3f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f400 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67  if( pAlt->wtFlag
2f410 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29  s & (TERM_CODED)
2f420 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f430 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2f440 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e  ((v, "begin tran
2f450 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
2f460 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d 20  t"));.    sEq = 
2f470 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20  *pAlt->pExpr;.  
2f480 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70 45    sEq.pLeft = pE
2f490 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c  ->pLeft;.    sql
2f4a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2f4b0 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61 64  pParse, &sEq, ad
2f4c0 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
2f4d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a  UMPIFNULL);.  }.
2f4e0 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
2f4f0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
2f500 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2f510 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
2f520 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
2f530 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
2f540 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2f550 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
2f560 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
2f570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
2f580 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2f590 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2f5a0 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
2f5b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f5c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2f5d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f5e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
2f5f0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
2f600 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f610 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
2f620 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
2f630 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2f640 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2f650 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2f660 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
2f670 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
2f680 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
2f690 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2f6a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2f6b0 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
2f6c0 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
2f6d0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2f6e0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2f6f0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
2f700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2f710 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
2f720 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
2f730 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
2f740 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2f750 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2f760 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d  & newNotReady)!=
2f770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
2f780 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
2f790 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
2f7a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2f7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f7c0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
2f7d0 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
2f7e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2f7f0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
2f800 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
2f810 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2f820 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
2f830 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2f840 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
2f850 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
2f860 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2f870 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a   iReleaseReg);..
2f880 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52    return newNotR
2f890 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  eady;.}..#if def
2f8a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2f8b0 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  )./*.** The foll
2f8c0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68  owing variable h
2f8d0 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63  olds a text desc
2f8e0 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79  ription of query
2f8f0 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a   plan generated.
2f900 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ** by the most r
2f910 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
2f920 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2f930 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  ).  Each call to
2f940 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f   WhereBegin.** o
2f950 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
2f960 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e  evious.  This in
2f970 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2f980 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
2f990 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e  d.** analysis on
2f9a0 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ly..*/.char sqli
2f9b0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42  te3_query_plan[B
2f9c0 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65  MS*2*40];  /* Te
2f9d0 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  xt of the join *
2f9e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50  /.static int nQP
2f9f0 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lan = 0;        
2fa00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
2fa10 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72  ee slow in _quer
2fa20 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e  y_plan[] */..#en
2fa30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
2fa40 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 57 48  ST */..#ifdef WH
2fa50 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2fa60 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
2fa70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
2fa80 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
2fa90 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
2faa0 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
2fab0 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
2fac0 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  p, SrcList *pTab
2fad0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20  List){.  int nb 
2fae0 3d 20 32 2a 28 28 70 54 61 62 4c 69 73 74 2d 3e  = 2*((pTabList->
2faf0 6e 53 72 63 2b 31 35 29 2f 31 36 29 3b 0a 20 20  nSrc+15)/16);.  
2fb00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2fb10 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61  tem *pItem = pTa
2fb20 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54  bList->a + p->iT
2fb30 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ab;.  Table *pTa
2fb40 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2fb50 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2fb60 72 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30  rintf("%c %2d.%0
2fb70 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
2fb80 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
2fb90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
2fba0 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
2fbb0 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
2fbc0 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
2fbd0 62 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22  bugPrintf(" %8s"
2fbe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fbf0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
2fc00 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
2fc10 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
2fc20 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
2fc30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2fc40 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2fc50 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ){.    if( p->u.
2fc60 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a  btree.pIndex ){.
2fc70 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2fc80 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   *zName = p->u.b
2fc90 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
2fca0 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  me;.      if( st
2fcb0 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
2fcc0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
2fcd0 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
2fce0 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
2fcf0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
2fd00 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
2fd10 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
2fd20 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
2fd30 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
2fd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2fd50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2fd60 28 22 2e 25 2d 31 32 73 20 25 32 64 22 2c 20 7a  (".%-12s %2d", z
2fd70 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
2fd80 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
2fd90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2fda0 65 62 75 67 50 72 69 6e 74 66 28 22 25 31 36 73  ebugPrintf("%16s
2fdb0 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
2fdc0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2fdd0 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
2fde0 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
2fdf0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
2fe00 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
2fe10 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
2fe20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
2fe30 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
2fe40 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
2fe50 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
2fe60 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
2fe70 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
2fe80 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
2fe90 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
2fea0 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
2feb0 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
2fec0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2fed0 67 50 72 69 6e 74 66 28 22 20 25 2d 31 35 73 22  gPrintf(" %-15s"
2fee0 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
2fef0 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
2ff00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2ff10 6e 74 66 28 22 20 66 67 20 25 30 38 78 20 4e 20  ntf(" fg %08x N 
2ff20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
2ff30 20 70 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 73 71   p->nTerm);.  sq
2ff40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ff50 28 22 20 63 6f 73 74 20 25 2e 32 67 2c 25 2e 32  (" cost %.2g,%.2
2ff60 67 2c 25 2e 32 67 5c 6e 22 2c 0a 20 20 20 20 20  g,%.2g\n",.     
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff80 70 2d 3e 70 72 65 72 65 71 2c 20 70 2d 3e 72 53  p->prereq, p->rS
2ff90 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  etup, p->rRun, p
2ffa0 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  ->nOut);.}.#endi
2ffb0 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  f../*.** Dealloc
2ffc0 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
2ffd0 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
2ffe0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
2fff0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
30000 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
30010 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
30020 6f 6f 70 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  oop *p){.  sqlit
30030 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
30040 61 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 54 65  aTerm);.  p->aTe
30050 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 54 65  rm = 0;.  p->nTe
30060 72 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 28 70  rm = 0;.  if( (p
30070 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
30080 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
30090 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
300a0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
300b0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
300c0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
300d0 29 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  );.    p->u.vtab
300e0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
300f0 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
30100 53 74 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Str = 0;.  }.}..
30110 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
30120 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
30130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
30140 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
30150 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
30160 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
30170 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
30180 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
30190 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
301a0 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
301b0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
301c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
301d0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
301e0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
301f0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
30200 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
30210 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
30220 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30230 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
30240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
30250 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
30260 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e  pInfo = pWInfo->
30270 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[i].pIdxInfo;. 
30280 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29       if( pInfo )
30290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73  {.        /* ass
302a0 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64  ert( pInfo->need
302b0 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
302c0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
302d0 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  led ); */.      
302e0 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65    if( pInfo->nee
302f0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
30300 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30310 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69  e3_free(pInfo->i
30320 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
30330 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
30340 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66  3DbFree(db, pInf
30350 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
30360 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b    if( pWInfo->a[
30370 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  i].plan.wsFlags 
30380 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
30390 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  EX ){.        In
303a0 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49 6e  dex *pIdx = pWIn
303b0 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e  fo->a[i].plan.u.
303c0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
303d0 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
303e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
303f0 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c  e(db, pIdx->zCol
30400 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Aff);.          
30410 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30420 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
30430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30440 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
30450 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57  Clear(pWInfo->pW
30460 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  C);.    while( p
30470 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b  WInfo->pLoops ){
30480 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
30490 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
304a0 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e  oops;.      pWIn
304b0 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e  fo->pLoops = p->
304c0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
304d0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
304e0 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
304f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
30500 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
30510 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
30520 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
30530 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
30540 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
30550 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
30560 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
30570 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
30580 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
30590 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
305a0 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
305b0 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
305c0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
305d0 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
305e0 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
305f0 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
30600 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
30610 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
30620 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
30630 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
30640 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
30650 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
30660 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
30670 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
30680 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6e 6f  * added based no
30690 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
306a0 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
306b0 2d 3e 70 42 65 73 74 20 69 73 20 6e 6f 74 20 4e  ->pBest is not N
306c0 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  ULL then we only
306d0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
306e0 76 65 72 79 0a 2a 2a 20 62 65 73 74 20 74 65 6d  very.** best tem
306f0 70 6c 61 74 65 20 61 6e 64 20 74 68 61 74 20 74  plate and that t
30700 65 6d 70 6c 61 74 65 20 73 68 6f 75 6c 64 20 62  emplate should b
30710 65 20 73 74 6f 72 65 64 20 69 6e 20 70 42 75 69  e stored in pBui
30720 6c 64 65 72 2d 3e 70 42 65 73 74 2e 0a 2a 2a 20  lder->pBest..** 
30730 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
30740 73 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  st is NULL then 
30750 61 20 6c 69 73 74 20 6f 66 20 74 68 65 20 62 65  a list of the be
30760 73 74 20 74 65 6d 70 6c 61 74 65 73 20 61 72 65  st templates are
30770 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 42   stored.** in pB
30780 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
30790 70 4c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  pLoops..**.** Wh
307a0 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  en accumulating 
307b0 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28  multiple loops (
307c0 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  when pBuilder->p
307d0 42 65 73 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  Best is NULL) we
307e0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
307f0 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
30800 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
30810 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
30820 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65   the.** template
30830 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
30840 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
30850 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
30860 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
30870 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
30880 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
30890 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
308a0 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
308b0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
308c0 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
308d0 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
308e0 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
308f0 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
30900 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
30910 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
30920 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
30930 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
30940 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
30950 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
30960 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oop.*/.static in
30970 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  t whereLoopInser
30980 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
30990 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68  er *pBuilder, Wh
309a0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
309b0 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  te){.  WhereLoop
309c0 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a   **ppPrev, *p, *
309d0 70 4e 65 78 74 20 3d 20 30 2c 20 2a 70 54 6f 46  pNext = 0, *pToF
309e0 72 65 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ree = 0;.  Where
309f0 54 65 72 6d 20 2a 2a 70 61 54 65 72 6d 20 3d 20  Term **paTerm = 
30a00 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
30a10 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b   = pBuilder->db;
30a20 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
30a30 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
30a40 3e 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 49  >pWInfo;..  /* I
30a50 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73  f pBuilder->pBes
30a60 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
30a70 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
30a80 63 6b 20 6f 66 20 74 68 65 20 73 69 6e 67 6c 65  ck of the single
30a90 0a 20 20 2a 2a 20 62 65 73 74 20 57 68 65 72 65  .  ** best Where
30aa0 4c 6f 6f 70 2e 20 20 70 42 75 69 6c 64 65 72 2d  Loop.  pBuilder-
30ab0 3e 70 42 65 73 74 2d 3e 6d 61 73 6b 53 65 6c 66  >pBest->maskSelf
30ac0 3d 3d 30 20 69 6e 64 69 63 61 74 65 73 20 74 68  ==0 indicates th
30ad0 61 74 20 6e 6f 0a 20 20 2a 2a 20 70 72 69 6f 72  at no.  ** prior
30ae0 20 57 68 65 72 65 4c 6f 6f 70 73 20 68 61 76 65   WhereLoops have
30af0 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20   been evaluated 
30b00 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72  and that the cur
30b10 72 65 6e 74 20 70 54 65 6d 70 6c 61 74 65 0a 20  rent pTemplate. 
30b20 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
30b30 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 68   the first and h
30b40 65 6e 63 65 20 74 68 65 20 62 65 73 74 20 61 6e  ence the best an
30b50 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 61  d should be reta
30b60 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ined..  */.  if(
30b70 20 28 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   (p = pBuilder->
30b80 70 42 65 73 74 29 21 3d 30 20 29 7b 0a 20 20 20  pBest)!=0 ){.   
30b90 20 69 66 28 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   if( p->maskSelf
30ba0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
30bb0 20 70 2d 3e 72 52 75 6e 2b 70 2d 3e 72 53 65 74   p->rRun+p->rSet
30bc0 75 70 20 3c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  up < pTemplate->
30bd0 72 52 75 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e  rRun+pTemplate->
30be0 72 53 65 74 75 70 20 29 7b 0a 20 20 20 20 20 20  rSetup ){.      
30bf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30c00 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
30c10 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 2b 70 2d    if( p->rRun+p-
30c20 3e 72 53 65 74 75 70 20 3d 3d 20 70 54 65 6d 70  >rSetup == pTemp
30c30 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 54 65 6d 70  late->rRun+pTemp
30c40 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20  late->rSetup.   
30c50 20 20 20 20 26 26 20 70 2d 3e 70 72 65 72 65 71      && p->prereq
30c60 20 3c 3d 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70   <= pTemplate->p
30c70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20  rereq ){.       
30c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30c90 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
30ca0 0a 20 20 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70  .    *p = *pTemp
30cb0 6c 61 74 65 3b 0a 20 20 20 20 70 2d 3e 61 54 65  late;.    p->aTe
30cc0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 75  rm = 0;.    p->u
30cd0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
30ce0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
30cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
30d00 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
30d10 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
30d20 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74  Loop to overwrit
30d30 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65  e, or which take
30d40 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20  s.  ** priority 
30d50 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a  over pTemplate..
30d60 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65    */.  for(ppPre
30d70 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  v=&pWInfo->pLoop
30d80 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b  s, p=*ppPrev; p;
30d90 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
30da0 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
30db0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
30dc0 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
30dd0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
30de0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
30df0 53 6f 72 74 49 64 78 20 29 20 63 6f 6e 74 69 6e  SortIdx ) contin
30e00 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  ue;.    if( (p->
30e10 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
30e20 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e  te->prereq)==p->
30e30 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70  prereq.     && p
30e40 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
30e50 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20  ate->rSetup.    
30e60 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
30e70 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20  mplate->rRun.   
30e80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 72   ){.      /* Alr
30e90 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 6e 20  eady holding an 
30ea0 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20  equal or better 
30eb0 57 68 65 72 65 4c 6f 6f 70 2e 0a 20 20 20 20 20  WhereLoop..     
30ec0 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f   ** Return witho
30ed0 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61  ut changing or a
30ee0 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  dding anything *
30ef0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
30f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
30f10 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
30f20 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
30f30 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
30f40 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20  te->prereq.     
30f50 26 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  && p->rSetup>=pT
30f60 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a  emplate->rSetup.
30f70 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
30f80 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
30f90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
30fa0 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
30fb0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
30fc0 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
30fd0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78  ne */.      pNex
30fe0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
30ff0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
31000 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20  pClear(db, p);. 
31010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31020 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
31030 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
31040 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
31050 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
31060 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
31070 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
31080 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
31090 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
310a0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
310b0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
310c0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
310d0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  rt it..  */.  if
310e0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20  ( p==0 ){.    p 
310f0 3d 20 70 54 6f 46 72 65 65 20 3d 20 73 71 6c 69  = pToFree = sqli
31100 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
31110 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
31120 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  oop));.    if( p
31130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
31140 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
31150 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e   if( pTemplate->
31160 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 61 54  nTerm ){.    paT
31170 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  erm = sqlite3DbM
31180 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 54 65  allocRaw(db, pTe
31190 6d 70 6c 61 74 65 2d 3e 6e 54 65 72 6d 2a 73 69  mplate->nTerm*si
311a0 7a 65 6f 66 28 70 2d 3e 61 54 65 72 6d 5b 30 5d  zeof(p->aTerm[0]
311b0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 61 54 65  ));.    if( paTe
311c0 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rm==0 ){.      s
311d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
311e0 20 70 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   pToFree);.     
311f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31200 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
31210 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70 6c 61 74    *p = *pTemplat
31220 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  e;.  p->pNextLoo
31230 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
31240 50 72 65 76 20 3d 20 70 3b 0a 20 20 70 2d 3e 61  Prev = p;.  p->a
31250 54 65 72 6d 20 3d 20 70 61 54 65 72 6d 3b 0a 20  Term = paTerm;. 
31260 20 69 66 28 20 70 2d 3e 6e 54 65 72 6d 20 29 7b   if( p->nTerm ){
31270 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
31280 54 65 72 6d 2c 20 70 54 65 6d 70 6c 61 74 65 2d  Term, pTemplate-
31290 3e 61 54 65 72 6d 2c 20 70 2d 3e 6e 54 65 72 6d  >aTerm, p->nTerm
312a0 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65 72 6d  *sizeof(p->aTerm
312b0 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
312c0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
312d0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
312e0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
312f0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
31300 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
31310 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
31320 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
31330 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
31340 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
31350 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
31360 0a 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e  .    pTemplate->
31370 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
31380 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
31390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
313a0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
313b0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
313c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
313d0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
313e0 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64  f the index pInd
313f0 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61  ex..** Try to ma
31400 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
31410 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
31420 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
31430 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
31440 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
31450 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
31460 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
31470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
31480 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
31490 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
314a0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
314b0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
314c0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
314d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
314e0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
314f0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
31500 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
31510 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
31520 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
31530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31540 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
31550 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 4d 75 6c   */.  int nInMul
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31580 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
31590 65 20 74 6f 20 49 4e 20 2a 2f 0a 29 7b 0a 20 20  e to IN */.){.  
315a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315c0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
315d0 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
315e0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
315f0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
31600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
31610 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
31620 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
31630 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
31640 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
31650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
31660 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
31670 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
31680 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
316b0 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
316c0 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
316d0 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
316e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
316f0 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
31700 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  erms */.  WhereL
31710 6f 6f 70 20 73 61 76 65 64 4c 6f 6f 70 3b 20 20  oop savedLoop;  
31720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
31730 65 64 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  ed original cont
31740 65 6e 74 20 6f 66 20 70 4e 65 77 5b 5d 20 2a 2f  ent of pNew[] */
31750 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
31780 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
31790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
317a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
317b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
317c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
317d0 74 52 6f 77 63 6e 74 20 69 52 6f 77 45 73 74 3b  tRowcnt iRowEst;
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317f0 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64  /* Estimated ind
31800 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a  ex selectivity *
31810 2f 0a 20 20 64 6f 75 62 6c 65 20 72 4c 6f 67 53  /.  double rLogS
31820 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
31830 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
31840 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
31850 2f 0a 0a 20 20 64 62 20 3d 20 70 42 75 69 6c 64  /..  db = pBuild
31860 65 72 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  er->db;.  pNew =
31870 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
31880 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
31890 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
318a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
318b0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
318c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
318d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
318e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
318f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
31900 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  <=pProbe->nColum
31910 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  n );.  assert( (
31920 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
31930 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
31940 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
31950 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
31960 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
31970 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
31980 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
31990 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
319a0 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
319b0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
319c0 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
319d0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
319e0 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
319f0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
31a00 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
31a10 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
31a20 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
31a30 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
31a40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
31a50 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
31a60 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
31a70 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
31a80 5f 4c 45 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65  _LE);..  if( pNe
31a90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
31aa0 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e   pProbe->nColumn
31ab0 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
31ac0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
31ad0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
31ae0 71 5d 3b 0a 20 20 20 20 69 52 6f 77 45 73 74 20  q];.    iRowEst 
31af0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  = pProbe->aiRowE
31b00 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  st[pNew->u.btree
31b10 2e 6e 45 71 2b 31 5d 3b 0a 20 20 7d 65 6c 73 65  .nEq+1];.  }else
31b20 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
31b30 0a 20 20 20 20 69 52 6f 77 45 73 74 20 3d 20 31  .    iRowEst = 1
31b40 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
31b50 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
31b60 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
31b70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
31b80 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ba0 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
31bb0 3b 0a 20 20 73 61 76 65 64 4c 6f 6f 70 20 3d 20  ;.  savedLoop = 
31bc0 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 72  *pNew;.  pNew->r
31bd0 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65 29  Setup = (double)
31be0 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  0;.  rLogSize = 
31bf0 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e 61  estLog(pProbe->a
31c00 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 66  iRowEst[0]);.  f
31c10 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
31c20 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
31c30 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
31c40 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
31c50 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 31 3b 0a     int nIn = 1;.
31c60 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
31c70 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 4c 6f 6f  e.nEq = savedLoo
31c80 70 2e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  p.u.btree.nEq;. 
31c90 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d     pNew->nTerm =
31ca0 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 54 65 72 6d   savedLoop.nTerm
31cb0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
31cc0 6e 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72 2d  nTerm>=pBuilder-
31cd0 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  >mxTerm ) break;
31ce0 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 6f 6c   /* Repeated col
31cf0 75 6d 6e 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  umn in index */.
31d00 20 20 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b      pNew->aTerm[
31d10 70 4e 65 77 2d 3e 6e 54 65 72 6d 2b 2b 5d 20 3d  pNew->nTerm++] =
31d20 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
31d30 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
31d40 64 4c 6f 6f 70 2e 70 72 65 72 65 71 20 7c 20 70  dLoop.prereq | p
31d50 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
31d60 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
31d70 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 70 54  Self;.    if( pT
31d80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
31d90 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
31da0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
31db0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
31dc0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
31dd0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
31de0 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
31df0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
31e00 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
31e10 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
31e20 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
31e30 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68  ..)":  Assume th
31e40 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
31e50 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
31e60 20 20 20 20 6e 49 6e 20 3d 20 32 35 3b 0a 20 20      nIn = 25;.  
31e70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
31e80 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
31e90 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
31ea0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
31eb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
31ec0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
31ed0 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
31ee0 20 20 6e 49 6e 20 3d 20 70 45 78 70 72 2d 3e 78    nIn = pExpr->x
31ef0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
31f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
31f10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
31f20 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
31f30 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 69 52 6f  ut = (double)iRo
31f40 77 45 73 74 20 2a 20 6e 49 6e 4d 75 6c 20 2a 20  wEst * nInMul * 
31f50 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nIn;.    }else i
31f60 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
31f70 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
31f80 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
31f90 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
31fa0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
31fb0 51 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  Q;.      pNew->u
31fc0 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
31fd0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
31fe0 20 28 64 6f 75 62 6c 65 29 69 52 6f 77 45 73 74   (double)iRowEst
31ff0 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   * nInMul;.    }
32000 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
32010 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
32020 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
32030 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
32040 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
32050 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
32060 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e  _LIMIT;.      pN
32070 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
32080 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20 20 20  Loop.nOut/3;.   
32090 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
320a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
320b0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20  O_LT|WO_LE) ){. 
320c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
320d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
320e0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
320f0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
32100 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
32110 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20  edLoop.nOut/3;. 
32120 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 72     }.    pNew->r
32130 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 2a 6e  Run = rLogSize*n
32140 49 6e 3b 20 20 2f 2a 20 43 6f 73 74 20 66 6f 72  In;  /* Cost for
32150 20 6e 49 6e 20 62 69 6e 61 72 79 20 73 65 61 72   nIn binary sear
32160 63 68 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ches */.    if( 
32170 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
32180 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
32190 57 48 45 52 45 5f 49 50 4b 29 20 29 7b 0a 20 20  WHERE_IPK) ){.  
321a0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
321b0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f  = pNew->nOut;  /
321c0 2a 20 55 6e 69 74 20 73 74 65 70 20 63 6f 73 74  * Unit step cost
321d0 20 74 6f 20 72 65 61 63 68 20 65 61 63 68 20 72   to reach each r
321e0 6f 77 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ow */.    }else{
321f0 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
32200 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
32210 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
32220 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
32230 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
32240 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
32250 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
32260 72 52 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f  rRun += pNew->nO
32270 75 74 2a 28 31 20 2b 20 72 4c 6f 67 53 69 7a 65  ut*(1 + rLogSize
32280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
32290 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
322a0 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54   and rRun for ST
322b0 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73  AT3 range values
322c0 20 2a 2f 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20   */.    /* TBD: 
322d0 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72 20  Adjust nOut for 
322e0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
322f0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63  raints */.    rc
32300 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
32310 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
32320 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
32330 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
32340 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
32350 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
32360 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
32370 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
32380 20 26 26 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   && pProbe->zNam
32390 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  e!=0.    ){.    
323a0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
323b0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
323c0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
323d0 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29 3b 0a 20 20   nInMul*nIn);.  
323e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 20    }.  }.  *pNew 
323f0 3d 20 73 61 76 65 64 4c 6f 6f 70 3b 0a 20 20 72  = savedLoop;.  r
32400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32410 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
32420 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
32430 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
32440 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
32450 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
32460 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
32470 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
32480 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
32490 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
324a0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
324b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
324c0 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
324d0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
324e0 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
324f0 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
32500 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
32510 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
32520 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
32530 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
32540 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
32550 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
32560 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
32570 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
32580 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
32590 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 43  t *pOB;.  int iC
325a0 6f 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20  ol;.  int ii;.. 
325b0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
325c0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3d  lder->pOrderBy)=
325d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
325e0 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e   iCol = pIndex->
325f0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 66  aiColumn[0];.  f
32600 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
32610 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
32620 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
32630 20 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70   pOB->a[ii].pExp
32640 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
32650 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
32660 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
32670 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
32680 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
32690 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
326a0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 20 72  Column==iCol ) r
326b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72  eturn 1;.      r
326c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
326d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
326e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
326f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
32700 73 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  s a single table
32710 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72   of the join wer
32720 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
32730 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42  s idenfied by pB
32740 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
32750 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
32760 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
32770 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
32780 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
32790 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
327a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
327b0 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
327c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
327d0 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
327e0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
327f0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
32800 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
32810 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
32820 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
32830 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
32840 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ble */.){.  Inde
32850 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
32860 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
32870 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
32880 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
32890 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
328a0 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
328b0 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
328c0 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
328d0 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
328e0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
328f0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
32900 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
32910 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
32920 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
32930 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
32940 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
32950 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
32960 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 74 72 75   index */.  stru
32970 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
32980 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
32990 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
329a0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
329b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
329c0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
329d0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
329e0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
329f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32a00 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
32a10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
32a20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 30  int iSortIdx = 0
32a30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
32a40 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
32a50 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a70 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
32a80 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 53 69 7a  */.  double rSiz
32a90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
32aa0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
32ab0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
32ac0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 4c 6f 67  */.  double rLog
32ad0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32ae0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
32af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
32b00 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
32b10 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
32b20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
32b30 20 20 70 53 72 63 20 3d 20 70 42 75 69 6c 64 65    pSrc = pBuilde
32b40 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  r->pTabList->a +
32b50 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61   pNew->iTab;.  a
32b60 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
32b70 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
32b80 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
32b90 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
32ba0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
32bb0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
32bc0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
32bd0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
32be0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
32bf0 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
32c00 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
32c10 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
32c20 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
32c30 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
32c40 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
32c50 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
32c60 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
32c70 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
32c80 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
32c90 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
32ca0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
32cb0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
32cc0 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
32cd0 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
32ce0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
32cf0 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
32d00 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
32d30 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
32d40 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
32d50 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
32d60 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
32d70 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
32d80 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
32d90 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
32da0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
32db0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
32dc0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
32dd0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
32de0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
32df0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
32e00 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
32e10 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
32e20 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
32e30 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
32e40 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
32e50 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
32e60 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
32e70 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
32e80 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
32e90 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
32ea0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
32eb0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
32ec0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
32ed0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
32ee0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
32ef0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
32f00 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
32f10 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
32f20 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
32f30 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
32f40 20 28 64 6f 75 62 6c 65 29 70 53 72 63 2d 3e 70   (double)pSrc->p
32f50 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
32f60 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
32f70 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  g(rSize);..  /* 
32f80 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
32f90 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
32fa0 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20 20 26  lder->pBest.   &
32fb0 26 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 50 61  & (pBuilder->pPa
32fc0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
32fd0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
32fe0 78 29 21 3d 30 20 0a 20 20 20 26 26 20 21 70 53  x)!=0 .   && !pS
32ff0 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
33000 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
33010 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21  tIndexed.   && !
33020 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
33030 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ed.  ){.    /* G
33040 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
33050 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
33060 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
33070 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72   *pWC = pBuilder
33080 2d 3e 70 57 43 3b 0a 20 20 20 20 57 68 65 72 65  ->pWC;.    Where
33090 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
330a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
330b0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
330c0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
330d0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
330e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
330f0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
33100 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
33110 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
33120 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
33130 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
33140 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
33150 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
33160 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
33170 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
33180 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 31   pNew->nTerm = 1
33190 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
331a0 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  aTerm[0] = pTerm
331b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
331c0 72 53 65 74 75 70 20 3d 20 32 2a 72 4c 6f 67 53  rSetup = 2*rLogS
331d0 69 7a 65 2a 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ize*pSrc->pTab->
331e0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 20 20 20  nRowEst;.       
331f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64   pNew->nOut = (d
33200 6f 75 62 6c 65 29 31 30 3b 0a 20 20 20 20 20 20  ouble)10;.      
33210 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
33220 4c 6f 67 53 69 7a 65 20 2b 20 70 4e 65 77 2d 3e  LogSize + pNew->
33230 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
33240 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
33250 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
33260 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
33270 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
33280 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
33290 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
332a0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
332b0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
332c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
332d0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f    }..  /* Loop o
332e0 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
332f0 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
33300 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
33310 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
33320 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
33330 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 70 4e 65  tIdx++){.    pNe
33340 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
33350 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 54   0;.    pNew->nT
33360 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
33370 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
33380 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
33390 70 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  p = (double)0;. 
333a0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
333b0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
333c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
333d0 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
333e0 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
333f0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
33400 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
33410 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
33420 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
33430 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
33440 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
33450 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
33460 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
33470 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
33480 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
33490 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
334a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
334b0 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
334c0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 28 72 53  pNew->rRun = (rS
334d0 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a  ize + rLogSize)*
334e0 28 33 2b 62 29 3b 20 2f 2a 20 34 78 20 70 65 6e  (3+b); /* 4x pen
334f0 61 6c 74 79 20 66 6f 72 20 61 20 66 75 6c 6c 2d  alty for a full-
33500 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 72 63  scan */.      rc
33510 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
33520 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
33530 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
33540 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
33550 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
33560 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  sk m = pSrc->col
33570 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  Used;.      int 
33580 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  j;.      for(j=p
33590 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  Probe->nColumn-1
335a0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
335b0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
335c0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  robe->aiColumn[j
335d0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
335e0 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
335f0 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
33600 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
33610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33620 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
33630 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 57 48  gs = (m==0) ? WH
33640 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 3a 20 30  ERE_IDX_ONLY : 0
33650 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
33660 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
33670 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 6d 3d  */.      if( (m=
33680 3d 30 20 7c 7c 20 62 29 20 26 26 20 70 50 72 6f  =0 || b) && pPro
33690 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
336a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
336b0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
336c0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
336d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
336e0 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
336f0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
33700 20 28 6d 3d 3d 30 29 20 3f 20 28 72 53 69 7a 65   (m==0) ? (rSize
33710 20 2b 20 72 4c 6f 67 53 69 7a 65 29 2a 28 31 2b   + rLogSize)*(1+
33720 62 29 20 3a 20 28 72 53 69 7a 65 2a 72 4c 6f 67  b) : (rSize*rLog
33730 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
33740 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
33750 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
33760 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
33770 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
33780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
33790 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
337a0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
337b0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
337c0 65 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  e, 1);..    /* I
337d0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
337e0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
337f0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
33800 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
33810 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
33820 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
33830 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
33840 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
33860 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
33870 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
33880 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
33890 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
338a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
338b0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
338c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
338d0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
338e0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
338f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
33900 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
33910 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
33920 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
33930 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
33940 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
33950 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
33960 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
33970 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
33980 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
33990 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  e */.){.  Parse 
339a0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
339b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
339c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
339d0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
339e0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
339f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
33a00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
33a10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
33a20 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
33a30 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
33a40 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
33a50 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
33a60 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
33a70 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
33a80 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
33a90 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
33aa0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
33ab0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
33ac0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
33ad0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
33ae0 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
33af0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
33b00 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
33b10 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
33b20 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
33b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33b40 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
33b50 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
33b60 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
33b70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
33b80 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
33b90 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
33ba0 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
33bb0 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
33bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33bd0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
33be0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
33bf0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
33c00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
33c10 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
33c20 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50 61 72  LITE_OK;..  pPar
33c30 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  se = pBuilder->p
33c40 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
33c50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
33c60 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
33c70 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
33c80 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
33c90 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 54   = &pBuilder->pT
33ca0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
33cb0 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
33cc0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
33cd0 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
33ce0 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
33cf0 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
33d00 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
33d10 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
33d20 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
33d30 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
33d40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
33d50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
33d60 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
33d70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
33d80 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
33d90 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
33da0 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
33db0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
33dc0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
33dd0 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
33de0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
33df0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 0a 20  straintUsage;.. 
33e00 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
33e10 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
33e20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
33e30 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
33e40 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
33e50 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
33e60 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
33e70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
33e80 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
33e90 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
33ea0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
33eb0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
33ec0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
33ed0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
33ee0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
33ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
33f00 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
33f10 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
33f20 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
33f30 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
33f40 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
33f50 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
33f60 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
33f70 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
33f80 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
33f90 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
33fa0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
33fb0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
33fc0 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
33fd0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
33fe0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
33ff0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
34000 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
34010 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
34020 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
34030 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
34040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
34050 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
34060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34070 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
34080 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
34090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
340a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
340b0 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
340c0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
340d0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
340e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
340f0 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
34100 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
34110 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
34120 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
34130 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
34140 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
34150 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
34160 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
34170 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34180 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
34190 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
341a0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
341b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
341c0 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
341d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
341e0 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
341f0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
34200 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
34210 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
34220 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
34230 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
34240 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
34250 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
34260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34270 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
34280 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
34290 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
342a0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
342b0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
342c0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
342d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
342e0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
342f0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
34300 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
34310 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
34320 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
34330 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
34340 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
34350 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
34360 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
34370 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
34380 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
34390 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
343a0 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70  OINT... */.    p
343b0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
343c0 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
343d0 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62  BIG_DBL / ((doub
343e0 6c 65 29 32 29 3b 0a 20 20 20 20 72 63 20 3d 20  le)2);.    rc = 
343f0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
34400 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
34410 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
34420 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
34430 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
34440 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
34450 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
34460 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
34470 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
34480 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
34490 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
344a0 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
344b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
344c0 3c 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72  <pBuilder->mxTer
344d0 6d 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 54  m; i++) pNew->aT
344e0 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
344f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
34500 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
34510 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
34520 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
34530 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
34540 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
34550 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
34560 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
34570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
34580 20 69 54 65 72 6d 3e 3d 70 42 75 69 6c 64 65 72   iTerm>=pBuilder
34590 2d 3e 6d 78 54 65 72 6d 20 29 20 62 72 65 61 6b  ->mxTerm ) break
345a0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  ;.        j = pI
345b0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
345c0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
345d0 20 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e 66 6f   iTerm>=pIdxInfo
345e0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ->nConstraint.  
345f0 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
34600 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
34610 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
34620 20 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b   || pNew->aTerm[
34630 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
34640 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
34650 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
34660 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
34670 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
34680 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
34690 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
346a0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
346b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
346c0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
346d0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
346e0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
346f0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
34700 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
34710 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
34720 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
34730 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 54 65   pNew->aTerm[iTe
34740 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
34750 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
34760 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
34770 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
34780 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
34790 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
347a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
347b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 3b 0a  itMask |= 1<<i;.
347c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
347d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
347e0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
347f0 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
34800 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
34810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
34820 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
34830 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
34840 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
34850 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
34860 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
34870 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
34880 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
34890 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
348a0 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
348b0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
348c0 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
348d0 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
348e0 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
348f0 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
34900 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
34910 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
34920 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
34930 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
34940 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
34950 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
34960 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
34970 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
34980 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
34990 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
349a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
349b0 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
349c0 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
349d0 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
349e0 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
349f0 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
34a00 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
34a10 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
34a20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
34a30 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
34a40 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
34a50 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
34a60 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
34a70 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
34a80 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
34a90 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
34aa0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
34ab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34ac0 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  }.    if( i>=pId
34ad0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
34ae0 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
34af0 2d 3e 6e 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  ->nTerm = mxTerm
34b00 2b 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  +1;.      pNew->
34b10 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
34b20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
34b30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
34b40 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
34b50 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
34b60 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
34b70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
34b80 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
34b90 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
34ba0 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
34bb0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
34bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
34bd0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
34be0 75 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  u8)(pIdxInfo->nO
34bf0 72 64 65 72 42 79 21 3d 30 29 3b 0a 20 20 20 20  rderBy!=0);.    
34c00 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
34c10 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20   (double)0;.    
34c20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 70    pNew->rRun = p
34c30 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
34c40 65 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70 4e  edCost;.      pN
34c50 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62  ew->nOut = (doub
34c60 6c 65 29 32 35 3b 0a 20 20 20 20 20 20 77 68 65  le)25;.      whe
34c70 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
34c80 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
34c90 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
34ca0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
34cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34cc0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
34cd0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
34ce0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
34cf0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
34d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
34d10 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
34d20 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
34d30 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
34d40 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
34d50 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
34d60 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
34d70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
34d80 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
34d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34da0 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
34db0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
34dc0 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
34dd0 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
34de0 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
34df0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
34e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
34e10 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
34e20 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
34e30 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
34e40 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
34e50 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
34e60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
34e70 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
34e80 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
34e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34ea0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
34eb0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
34ec0 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
34ed0 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
34ee0 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ild;.  WhereLoop
34ef0 20 73 42 65 73 74 3b 0a 20 20 73 74 72 75 63 74   sBest;.  struct
34f00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
34f10 49 74 65 6d 3b 0a 20 20 0a 0a 20 20 70 57 43 20  Item;.  ..  pWC 
34f20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
34f30 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72  .  if( pWC->wctr
34f40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  lFlags & WHERE_A
34f50 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e  ND_ONLY ) return
34f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57   SQLITE_OK;.  pW
34f70 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
34f80 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
34f90 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
34fa0 4e 65 77 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  New;.  pItem = p
34fb0 42 75 69 6c 64 65 72 2d 3e 70 54 61 62 4c 69 73  Builder->pTabLis
34fc0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
34fd0 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
34fe0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 73 53  m->iCursor;.  sS
34ff0 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
35000 64 65 72 3b 0a 20 20 73 53 75 62 42 75 69 6c 64  der;.  sSubBuild
35010 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
35020 20 73 53 75 62 42 75 69 6c 64 2e 70 42 65 73 74   sSubBuild.pBest
35030 20 3d 20 26 73 42 65 73 74 3b 0a 20 20 74 65 6d   = &sBest;.  tem
35040 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43  pWC.pParse = pWC
35050 2d 3e 70 50 61 72 73 65 3b 0a 20 20 74 65 6d 70  ->pParse;.  temp
35060 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
35070 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 74  C->pMaskSet;.  t
35080 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
35090 57 43 3b 0a 20 20 74 65 6d 70 57 43 2e 6f 70 20  WC;.  tempWC.op 
350a0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 74 65 6d 70  = TK_AND;.  temp
350b0 57 43 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  WC.wctrlFlags = 
350c0 30 3b 0a 20 20 74 65 6d 70 57 43 2e 6e 54 65 72  0;.  tempWC.nTer
350d0 6d 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 70 54  m = 1;..  for(pT
350e0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
350f0 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
35100 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
35110 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
35120 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
35130 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
35140 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
35150 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
35160 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
35170 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
35180 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
35190 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
351a0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
351b0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
351c0 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
351d0 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
351e0 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
351f0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
35200 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
35210 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20    double rTotal 
35220 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  = 0;.      doubl
35230 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  e nRow = 0;.    
35240 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
35250 20 3d 20 6d 45 78 74 72 61 3b 0a 0a 0a 20 20 20   = mExtra;...   
35260 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
35270 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
35280 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
35290 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
352a0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
352b0 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
352c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
352d0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
352e0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
352f0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
35300 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
35310 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
35320 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
35330 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
35340 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
35350 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
35360 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
35370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35380 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
35390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
353a0 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d 20  Best.maskSelf = 
353b0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  0;.        if( I
353c0 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
353d0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
353e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
353f0 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
35400 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
35410 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35420 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
35430 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
35440 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
35450 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
35460 20 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73          if( sBes
35470 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20  t.maskSelf==0 ) 
35480 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
35490 73 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65  ssert( sBest.rSe
354a0 74 75 70 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29  tup==(double)0 )
354b0 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
354c0 20 2b 3d 20 73 42 65 73 74 2e 72 52 75 6e 3b 0a   += sBest.rRun;.
354d0 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
354e0 73 42 65 73 74 2e 6e 4f 75 74 3b 0a 20 20 20 20  sBest.nOut;.    
354f0 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42      prereq |= sB
35500 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  est.prereq;.    
35510 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
35520 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
35530 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20   pNew->aTerm[0] 
35540 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
35550 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
35560 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
35570 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
35580 70 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  p = (double)0;. 
35590 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
355a0 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
355b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
355c0 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
355d0 72 65 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a  rereq = prereq;.
355e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
355f0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
35600 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
35610 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
35620 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
35630 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20   pNew);.    }.  
35640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35650 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
35660 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
35670 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
35680 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
35690 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
356a0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
356b0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 42   *pBuilder){.  B
356c0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
356d0 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
356e0 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
356f0 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
35700 70 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c  pTabList = pBuil
35710 64 65 72 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  der->pTabList;. 
35720 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
35730 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
35740 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
35750 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
35760 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
35770 20 70 42 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20   pBuilder->db;. 
35780 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
35790 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
357a0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
357b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
357c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
357d0 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
357e0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
357f0 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
35800 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
35810 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  .  pBuilder->pNe
35820 77 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  w = pNew = sqlit
35830 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
35840 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
35850 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  oop));.  if( pNe
35860 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
35870 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 42  LITE_NOMEM;.  pB
35880 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20 3d  uilder->mxTerm =
35890 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 31 3b 0a 20   pWC->nTerm+1;. 
358a0 20 77 68 69 6c 65 28 20 70 57 43 2d 3e 70 4f 75   while( pWC->pOu
358b0 74 65 72 20 29 7b 0a 20 20 20 20 70 57 43 20 3d  ter ){.    pWC =
358c0 20 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20   pWC->pOuter;.  
358d0 20 20 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65    pBuilder->mxTe
358e0 72 6d 20 2b 3d 20 70 57 43 2d 3e 6e 54 65 72 6d  rm += pWC->nTerm
358f0 3b 0a 20 20 7d 0a 20 20 70 57 43 20 3d 20 70 42  ;.  }.  pWC = pB
35900 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
35910 4e 65 77 2d 3e 61 54 65 72 6d 20 3d 20 73 71 6c  New->aTerm = sql
35920 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
35930 28 64 62 2c 70 42 75 69 6c 64 65 72 2d 3e 6d 78  (db,pBuilder->mx
35940 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 4e 65 77  Term*sizeof(pNew
35950 2d 3e 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  ->aTerm[0]));.  
35960 69 66 28 20 70 4e 65 77 2d 3e 61 54 65 72 6d 3d  if( pNew->aTerm=
35970 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
35980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35990 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
359a0 64 64 41 6c 6c 5f 65 6e 64 3b 0a 20 20 7d 0a 20  ddAll_end;.  }. 
359b0 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
359c0 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
359d0 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
359e0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
359f0 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
35a00 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
35a10 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
35a20 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
35a30 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
35a40 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  or);.    if( (pI
35a50 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
35a60 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
35a70 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
35a80 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
35a90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
35aa0 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
35ab0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
35ac0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
35ad0 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
35ae0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
35af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
35b00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
35b10 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  ee(pBuilder, mEx
35b20 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
35b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35b40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
35b50 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
35b60 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
35b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69  ;.    }.    mPri
35b80 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b  or |= pNew->mask
35b90 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63  Self;.    if( rc
35ba0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
35bb0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
35bc0 7d 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  }.whereLoopAddAl
35bd0 6c 5f 65 6e 64 3a 0a 20 20 77 68 65 72 65 4c 6f  l_end:.  whereLo
35be0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 42 75  opDelete(db, pBu
35bf0 69 6c 64 65 72 2d 3e 70 4e 65 77 29 3b 0a 20 20  ilder->pNew);.  
35c00 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d  pBuilder->pNew =
35c10 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
35c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
35c30 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
35c40 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
35c50 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
35c60 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 34  ereLoop of the 4
35c70 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
35c80 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
35c90 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
35ca0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
35cb0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
35cc0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
35cd0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
35ce0 61 74 65 20 73 6f 75 72 63 65 20 6f 70 65 72 61  ate source opera
35cf0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
35d00 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
35d10 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
35d20 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
35d30 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
35d40 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
35d50 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
35d60 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
35d70 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
35d80 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
35d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
35da0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
35db0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
35dc0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
35dd0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
35de0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  use */.  WherePa
35df0 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
35e00 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
35e10 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
35e20 74 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  t nLoop,        
35e30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35e40 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
35e50 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
35e60 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
35e70 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
35e80 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
35e90 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
35ea0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
35eb0 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
35ec0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
35ed0 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
35ee0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
35ef0 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
35f00 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
35f10 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
35f20 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
35f30 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
35f40 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
35f50 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
35f60 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
35f70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
35f80 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
35f90 38 20 69 73 55 6e 69 71 75 65 3b 0a 20 20 75 38  8 isUnique;.  u8
35fa0 20 72 65 71 75 69 72 65 55 6e 69 71 75 65 20 3d   requireUnique =
35fb0 20 30 3b 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   0;.  u16 nColum
35fc0 6e 3b 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  n;.  u16 nOrderB
35fd0 79 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  y;.  int i, j;. 
35fe0 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30 3b 0a   int nUsed = 0;.
35ff0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
36000 74 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 57 68 65  t iColumn;.  Whe
36010 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
36020 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
36030 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
36040 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 20 2a  rderBy;.  Expr *
36050 70 4f 42 45 78 70 72 3b 0a 20 20 43 6f 6c 6c 53  pOBExpr;.  CollS
36060 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 49 6e 64  eq *pColl;.  Ind
36070 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 73 71  ex *pIndex;.  sq
36080 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
36090 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
360a0 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
360b0 6b 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  k = 0;..  /*.  *
360c0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
360d0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
360e0 6f 77 22 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ow" if all of th
360f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
36100 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
36110 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
36120 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
36130 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
36140 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
36150 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
36160 0a 20 20 2a 2a 20 47 65 6e 65 72 61 6c 20 72 75  .  ** General ru
36170 6c 65 73 3a 20 20 28 6e 6f 74 20 61 6e 20 61 6c  les:  (not an al
36180 67 6f 72 69 74 68 6d 21 29 0a 20 20 2a 2a 0a 20  gorithm!).  **. 
36190 20 2a 2a 20 20 28 31 29 20 49 66 20 74 68 65 20   **  (1) If the 
361a0 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
361b0 70 20 69 73 20 6f 6e 65 2d 72 6f 77 2c 20 74 68  p is one-row, th
361c0 65 6e 20 6d 61 74 63 68 20 6f 76 65 72 20 61 6e  en match over an
361d0 79 20 61 6e 64 20 61 6c 6c 0a 20 20 2a 2a 20 20  y and all.  **  
361e0 20 20 20 20 4f 52 44 45 52 20 42 59 20 74 65 72      ORDER BY ter
361f0 6d 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ms for the curre
36200 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  nt WhereLoop and
36210 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20   proceed to the 
36220 6e 65 78 74 0a 20 20 2a 2a 20 20 20 20 20 20 57  next.  **      W
36230 68 65 72 65 4c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20  hereLoop..  **. 
36240 20 2a 2a 20 20 28 32 29 20 49 66 20 74 68 65 20   **  (2) If the 
36250 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
36260 70 20 69 73 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  p is not one-row
36270 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 62 73 65  , then all subse
36280 71 75 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20 20  quent.  **      
36290 57 68 65 72 65 4c 6f 6f 70 73 20 6d 75 73 74 20  WhereLoops must 
362a0 62 65 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a  be one-row..  **
362b0 0a 20 20 2a 2a 20 20 28 33 29 20 4f 70 74 69 6f  .  **  (3) Optio
362c0 6e 61 6c 6c 79 20 6d 61 74 63 68 20 61 6e 79 20  nally match any 
362d0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 61  ORDER BY terms a
362e0 67 61 69 6e 73 74 20 74 68 65 20 66 69 72 73 74  gainst the first
362f0 20 6e 45 71 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a   nEq columns.  *
36300 2a 20 20 20 20 20 20 6f 66 20 74 68 65 20 69 6e  *      of the in
36310 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
36320 28 34 29 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e  (4) Index column
36330 73 20 70 61 73 74 20 6e 45 71 20 6d 75 73 74 20  s past nEq must 
36340 6d 61 74 63 68 20 4f 52 44 45 52 20 42 59 20 74  match ORDER BY t
36350 65 72 6d 73 20 6f 6e 65 2d 66 6f 72 2d 6f 6e 65  erms one-for-one
36360 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
36370 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
36380 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
36390 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
363a0 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
363b0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
363c0 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
363d0 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
363e0 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
363f0 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
36400 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
36410 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
36420 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3d 3d   assert( nLoop==
36430 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
36440 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73  pLast->u.vtab.is
36450 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 0a 20 20  Ordered;.  }..  
36460 2f 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 6c  /* Sorting is al
36470 77 61 79 73 20 72 65 71 75 69 72 65 64 20 69 66  ways required if
36480 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
36490 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74   ORDER BY is not
364a0 20 61 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   a .  ** column 
364b0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 6e  reference */.  n
364c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
364d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  By->nExpr;.  for
364e0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
364f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 42 45  ; i++){.    pOBE
36500 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
36510 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
36520 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
36530 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 42 45  r);.    if( pOBE
36540 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
36550 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
36560 20 7d 0a 20 20 20 20 0a 20 20 66 6f 72 28 69 3d   }.    .  for(i=
36570 30 3b 20 69 3c 3d 6e 4c 6f 6f 70 20 26 26 20 6e  0; i<=nLoop && n
36580 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b 20 69  Used<nOrderBy; i
36590 2b 2b 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ++){.    pLoop =
365a0 20 69 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68   i<nLoop ? pPath
365b0 2d 3e 61 4c 6f 6f 70 5b 69 5d 20 3a 20 70 4c 61  ->aLoop[i] : pLa
365c0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
365d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
365e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
365f0 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ABLE)==0 );.    
36600 69 73 55 6e 69 71 75 65 20 3d 20 31 3b 0a 20 20  isUnique = 1;.  
36610 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
36620 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
36630 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
36640 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36650 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
36660 21 3d 30 20 29 20 69 73 55 6e 69 71 75 65 20 3d  !=0 ) isUnique =
36670 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   0;.      if( pL
36680 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
36690 21 3d 31 20 29 20 69 73 55 6e 69 71 75 65 20 3d  !=1 ) isUnique =
366a0 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   0;.      pIndex
366b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6c   = 0;.      nCol
366c0 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  umn = 0;.    }el
366d0 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
366e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
366f0 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
36700 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
36710 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36720 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
36730 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
36740 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
36750 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
36760 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
36770 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ne ){.        is
36780 55 6e 69 71 75 65 20 3d 20 30 3b 0a 20 20 20 20  Unique = 0;.    
36790 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
367a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
367b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
367c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
367d0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
367e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367f0 20 20 20 20 20 7c 57 48 45 52 45 5f 43 4f 4c 55       |WHERE_COLU
36800 4d 4e 5f 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  MN_NULL))!=0 ){.
36810 20 20 20 20 20 20 20 20 69 73 55 6e 69 71 75 65          isUnique
36820 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
36830 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  e if( pLoop->u.b
36840 74 72 65 65 2e 6e 45 71 20 3c 20 70 49 6e 64 65  tree.nEq < pInde
36850 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
36860 20 20 20 20 20 20 69 73 55 6e 69 71 75 65 20 3d        isUnique =
36870 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36880 7d 0a 20 20 20 20 69 66 28 20 21 69 73 55 6e 69  }.    if( !isUni
36890 71 75 65 20 26 26 20 72 65 71 75 69 72 65 55 6e  que && requireUn
368a0 69 71 75 65 20 29 20 72 65 74 75 72 6e 20 30 3b  ique ) return 0;
368b0 0a 20 20 20 20 72 65 71 75 69 72 65 55 6e 69 71  .    requireUniq
368c0 75 65 20 3d 20 21 69 73 55 6e 69 71 75 65 3b 0a  ue = !isUnique;.
368d0 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
368e0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
368f0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
36900 73 6f 72 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  sor;.    j = 0;.
36910 20 20 20 20 72 65 76 53 65 74 20 3d 20 72 65 76      revSet = rev
36920 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
36930 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 20 26 26  0; j<=nColumn &&
36940 20 6e 55 73 65 64 3c 6e 4f 72 64 65 72 42 79 3b   nUsed<nOrderBy;
36950 20 6a 2b 2b 2c 20 6e 55 73 65 64 2b 2b 29 7b 0a   j++, nUsed++){.
36960 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
36970 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
36980 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
36990 3e 61 5b 6e 55 73 65 64 5d 2e 70 45 78 70 72 29  >a[nUsed].pExpr)
369a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
369b0 70 4f 42 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  pOBExpr->op==TK_
369c0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
369d0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
369e0 62 6c 65 21 3d 69 43 75 72 20 29 20 62 72 65 61  ble!=iCur ) brea
369f0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 55  k;.      if( isU
36a00 6e 69 71 75 65 20 29 20 63 6f 6e 74 69 6e 75 65  nique ) continue
36a10 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43  ;.      if( j<nC
36a20 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
36a30 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78   /* Normal index
36a40 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
36a50 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
36a60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
36a70 5d 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64  ];.        revId
36a80 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
36a90 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
36aa0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
36ab0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
36ac0 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
36ad0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
36ae0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
36af0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61  e ROWID column a
36b00 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20  t the end */.   
36b10 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
36b20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 76 49 64  1;.        revId
36b30 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
36b40 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
36b50 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
36b60 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
36b70 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
36b80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
36b90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
36ba0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
36bb0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
36bc0 42 79 2d 3e 61 5b 6e 55 73 65 64 5d 2e 70 45 78  By->a[nUsed].pEx
36bd0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
36be0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
36bf0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
36c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
36c10 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
36c20 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
36c30 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
36c40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
36c50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
36c60 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
36c70 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
36c80 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
36c90 6e 55 73 65 64 5d 2e 73 6f 72 74 4f 72 64 65 72  nUsed].sortOrder
36ca0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
36cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36cc0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
36cd0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 55 73   pOrderBy->a[nUs
36ce0 65 64 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  ed].sortOrder;. 
36cf0 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20         revSet = 
36d00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
36d10 0a 20 20 20 20 69 66 28 20 72 65 76 20 29 20 72  .    if( rev ) r
36d20 65 76 4d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d  evMask |= ((Bitm
36d30 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 20  ask)1)<<i;.  }. 
36d40 20 69 66 28 20 6e 55 73 65 64 3d 3d 6e 4f 72 64   if( nUsed==nOrd
36d50 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 52 65  erBy ){.    *pRe
36d60 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
36d70 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
36d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
36d90 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
36da0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
36db0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
36dc0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
36dd0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
36de0 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
36df0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
36e00 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
36e10 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
36e20 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
36e30 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
36e40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
36e50 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
36e60 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
36e70 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
36e80 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
36e90 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
36ea0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
36eb0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
36ec0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
36ed0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
36ee0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
36ef0 62 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f  bjects on pWInfo
36f00 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
36f10 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
36f20 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
36f30 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
36f40 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
36f50 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
36f60 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
36f70 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
36f80 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
36f90 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
36fa0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
36fb0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
36fc0 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
36fd0 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
36fe0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
36ff0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
37000 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
37010 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
37020 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 64 6f 75  nfo *pWInfo, dou
37030 62 6c 65 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  ble nRowEst){.  
37040 63 6f 6e 73 74 20 69 6e 74 20 6d 78 43 68 6f 69  const int mxChoi
37050 63 65 20 3d 20 31 30 3b 20 20 2f 2a 20 4d 61 78  ce = 10;  /* Max
37060 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
37070 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
37080 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
37090 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
370a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
370b0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
370c0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 73 71 6c  he join */.  sql
370d0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
370e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
370f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
37100 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
37110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
37130 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
37140 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
37150 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
37160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
37170 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
37180 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
37190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
371a0 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
371b0 20 20 64 6f 75 62 6c 65 20 6d 78 43 6f 73 74 3b    double mxCost;
371c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
371d0 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
371e0 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
371f0 0a 20 20 64 6f 75 62 6c 65 20 72 53 6f 72 74 43  .  double rSortC
37200 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
37210 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72  Cost to do a sor
37220 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  t */.  int nTo, 
37230 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
37240 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
37250 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
37260 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
37270 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
37280 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
37290 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
372a0 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
372b0 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
372c0 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
372d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
372e0 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
372f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
37300 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
37310 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
37320 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
37330 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
37340 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
37350 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
37360 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
37370 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
37380 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
37390 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
373a0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
373b0 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
373c0 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
373d0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
373e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
373f0 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
37400 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
37410 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
37420 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  y */.  char *pSp
37430 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
37440 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
37450 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
37460 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  s routine */..  
37470 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
37480 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
37490 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
374a0 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  l;.  assert( nLo
374b0 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
374c0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 23 69  List->nSrc );.#i
374d0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
374e0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
374f0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
37500 3d 32 20 29 20 73 71 6c 69 74 65 33 44 65 62 75  =2 ) sqlite3Debu
37510 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 62 65  gPrintf("---- be
37520 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 3b 0a  gin solver\n");.
37530 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c  #endif..  /* All
37540 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
37550 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
37560 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
37570 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
37580 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
37590 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
375a0 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
375b0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
375c0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
375d0 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
375e0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
375f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
37600 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
37610 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
37620 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
37630 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
37640 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
37650 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
37660 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
37670 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
37680 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
37690 61 54 6f 3b 20 69 69 3c 6d 78 43 68 6f 69 63 65  aTo; ii<mxChoice
376a0 2a 32 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  *2; ii++, pFrom+
376b0 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
376c0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
376d0 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
376e0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
376f0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
37700 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
37710 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
37720 6f 6f 70 73 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  oops */.  aFrom[
37730 30 5d 2e 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c  0].nRow = (doubl
37740 65 29 31 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  e)1;.  nFrom = 1
37750 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
37760 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
37770 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
37780 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
37790 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
377a0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
377b0 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
377c0 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
377d0 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73  ng */.  rSortCos
377e0 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  t = (double)0;. 
377f0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
37800 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
37810 45 73 74 3c 3d 30 2e 30 20 29 7b 0a 20 20 20 20  Est<=0.0 ){.    
37820 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
37830 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
37840 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d  else{.    /* Com
37850 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65  pute an estimate
37860 20 6f 6e 20 74 68 65 20 63 6f 73 74 20 74 6f 20   on the cost to 
37870 73 6f 72 74 20 74 68 65 20 65 6e 74 69 72 65 20  sort the entire 
37880 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
37890 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
378a0 6f 77 45 73 74 2a 65 73 74 4c 6f 67 28 6e 52 6f  owEst*estLog(nRo
378b0 77 45 73 74 29 3b 0a 23 69 66 64 65 66 20 57 48  wEst);.#ifdef WH
378c0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
378d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
378e0 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
378f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
37900 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
37910 73 6f 72 74 20 63 6f 73 74 3d 25 2d 37 2e 32 67  sort cost=%-7.2g
37920 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  \n", rSortCost);
37930 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
37940 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
37950 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
37960 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
37970 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
37980 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
37990 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
379a0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
379b0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
379c0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
379d0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
379e0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
379f0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
37a00 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
37a10 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
37a20 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
37a30 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
37a40 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
37a50 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
37a60 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
37a70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
37a80 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
37a90 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
37aa0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
37ab0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
37ac0 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
37ad0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
37ae0 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
37af0 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
37b00 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
37b10 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
37b20 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
37b30 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
37b40 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
37b50 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
37b60 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
37b70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
37b80 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
37b90 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
37ba0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
37bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
37bc0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
37bd0 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
37be0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
37bf0 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
37c00 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
37c10 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
37c20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 70         rCost = p
37c30 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 20 2b 20  WLoop->rSetup + 
37c40 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 2a 70 46 72  pWLoop->rRun*pFr
37c50 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 46 72 6f 6d  om->nRow + pFrom
37c60 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
37c70 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
37c80 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
37c90 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
37ca0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 72         if( !isOr
37cb0 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20  deredValid ){.  
37cc0 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
37cd0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
37ce0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
37cf0 2c 20 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 0a  , pFrom, iLoop,.
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 4c 6f              pWLo
37d30 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b  op, &revMask) ){
37d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
37d50 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70  e 1:  /* Yes.  p
37d60 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73  From+pWLoop does
37d70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
37d80 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
37da0 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  Ordered = 1;.   
37db0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
37dc0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
37dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
37de0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
37df0 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20  case 0:  /* No. 
37e00 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69   pFrom+pWLoop wi
37e10 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70  ll require a sep
37e20 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20  arate sort */.  
37e30 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
37e40 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  dered = 0;.     
37e50 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
37e60 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
37e70 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74             rCost
37e80 20 2b 3d 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20   += rSortCost;. 
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
37ea0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
37eb0 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e  default: /* Cann
37ec0 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72  ot tell yet.  Tr
37ed0 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e  y again on the n
37ee0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
37ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
37f00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
37f10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37f20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
37f30 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
37f40 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
37f50 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
37f60 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
37f70 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
37f80 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
37f90 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
37fa0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
37fb0 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
37fc0 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  ew && pTo->isOrd
37fd0 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
37fe0 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
37ff0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
38000 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
38010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
38020 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
38030 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
38040 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73  mxChoice && rCos
38050 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66  t>=mxCost ){.#if
38060 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
38070 4e 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20  NABLE.          
38080 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
38090 72 65 54 72 61 63 65 3e 3d 33 20 29 7b 0a 20 20  reTrace>=3 ){.  
380a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
380b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
380c0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
380d0 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e  -7.2g order=%c\n
380e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
380f0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
38100 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
38110 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
38120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38130 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
38140 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
38150 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
38160 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
38170 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
38180 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
38190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
381a0 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65       /* Add a ne
381b0 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61 54  w Path to the aT
381c0 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  o[] set */.     
381d0 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43       if( nTo<mxC
381e0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
381f0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
38200 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
38210 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20   aTo set by one 
38220 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
38230 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20  j = nTo++;.     
38240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
38250 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70          /* New p
38260 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65  ath replaces the
38270 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20   prior worst to 
38280 6b 65 65 70 20 63 6f 75