/ Hex Artifact Content
Login

Artifact 2be67c1a1a018b1de91f08e48baa02db13652e40:


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 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0570: 57 68 65 72 65 4c 6f 6f 70 20 57 68 65 72 65 4c  WhereLoop WhereL
0580: 6f 6f 70 3b 0a 74 79 70 65 64 65 66 20 73 74 72  oop;.typedef str
0590: 75 63 74 20 57 68 65 72 65 50 61 74 68 20 57 68  uct WherePath Wh
05a0: 65 72 65 50 61 74 68 3b 0a 74 79 70 65 64 65 66  erePath;.typedef
05b0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
05c0: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 74 79 70  m WhereTerm;.typ
05d0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05e0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 57 68 65  eLoopBuilder Whe
05f0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 3b 0a 74  reLoopBuilder;.t
0600: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
0610: 65 72 65 53 63 61 6e 20 57 68 65 72 65 53 63 61  ereScan WhereSca
0620: 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  n;.typedef struc
0630: 74 20 57 68 65 72 65 56 74 61 62 50 6c 61 6e 20  t WhereVtabPlan 
0640: 57 68 65 72 65 56 74 61 62 50 6c 61 6e 3b 0a 0a  WhereVtabPlan;..
0650: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
0660: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
0670: 65 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 61  ect represents a
0680: 20 77 61 79 20 6f 66 20 65 76 61 6c 75 61 74 69   way of evaluati
0690: 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f  ng one.** term o
06a0: 66 20 61 20 6a 6f 69 6e 2e 20 20 54 68 65 20 57  f a join.  The W
06b0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
06c0: 74 20 68 6f 6c 64 73 20 61 20 74 61 62 6c 65 20  t holds a table 
06d0: 6f 66 20 74 68 65 73 65 0a 2a 2a 20 6f 62 6a 65  of these.** obje
06e0: 63 74 73 20 75 73 69 6e 67 20 28 6d 61 73 6b 53  cts using (maskS
06f0: 65 6c 66 2c 70 72 65 72 65 71 2c 29 20 61 73 20  elf,prereq,) as 
0700: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
0710: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 0a    Note that the.
0720: 2a 2a 20 73 61 6d 65 20 6a 6f 69 6e 20 74 65 72  ** same join ter
0730: 6d 20 6d 69 67 68 74 20 68 61 76 65 20 6d 75 6c  m might have mul
0740: 74 69 70 6c 65 20 61 73 73 6f 63 69 61 74 65 64  tiple associated
0750: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
0760: 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  ts..*/.struct Wh
0770: 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d  ereLoop {.  Bitm
0780: 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20  ask prereq;     
0790: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
07a0: 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74  other loops that
07b0: 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20   must run first 
07c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  */.  Bitmask mas
07d0: 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69  kSelf;     /* Bi
07e0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
07f0: 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a  g table iTab */.
0800: 20 20 75 31 36 20 69 54 61 62 3b 20 20 20 20 20    u16 iTab;     
0810: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
0820: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
0830: 64 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ded by this loop
0840: 20 2a 2f 0a 20 20 75 31 36 20 6e 54 65 72 6d 3b   */.  u16 nTerm;
0850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0860: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
0870: 20 69 6e 20 61 54 65 72 6d 5b 5d 20 2a 2f 0a 20   in aTerm[] */. 
0880: 20 75 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20   u32 wsFlags;   
0890: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f         /* WHERE_
08a0: 2a 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  * flags describi
08b0: 6e 67 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20  ng the plan */. 
08c0: 20 64 6f 75 62 6c 65 20 72 53 65 74 75 70 3b 20   double rSetup; 
08d0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
08e0: 6d 65 20 73 65 74 75 70 20 63 6f 73 74 20 28 65  me setup cost (e
08f0: 78 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73 69  x: create transi
0900: 65 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20  ent index) */.  
0910: 64 6f 75 62 6c 65 20 72 52 75 6e 3b 20 20 20 20  double rRun;    
0920: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
0930: 20 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f   running each lo
0940: 6f 70 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  op */.  double n
0950: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Out;          /*
0960: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
0970: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
0980: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
0990: 20 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20    struct {      
09a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
09b0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65  rmation for inte
09c0: 72 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65  rnal btree table
09d0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
09e0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
09f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
0a00: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
0a10: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64  nts */.      Ind
0a20: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
0a30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
0a40: 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
0a50: 20 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73    } btree;.    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 76 69 72 74 75 61 6c  tion for virtual
0a90: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
0aa0: 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20   int idxNum;    
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
0ac0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
0ad0: 20 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20   u8 needFree;   
0ae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0af0: 69 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  if sqlite3_free(
0b00: 69 64 78 53 74 72 29 20 69 73 20 6e 65 65 64 65  idxStr) is neede
0b10: 64 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73  d */.      u8 is
0b20: 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20  Ordered;        
0b30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74    /* True if sat
0b40: 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59 20  isfies ORDER BY 
0b50: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 69  */.      char *i
0b60: 64 78 53 74 72 3b 20 20 20 20 20 20 20 20 20 20  dxStr;          
0b70: 2f 2a 20 49 6e 64 65 78 20 69 64 65 6e 74 69 66  /* Index identif
0b80: 69 65 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ier string */.  
0b90: 20 20 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75 3b    } vtab;.  } u;
0ba0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 61  .  WhereTerm **a
0bb0: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 57 68 65 72  Term;    /* Wher
0bc0: 65 54 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20  eTerms used */. 
0bd0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 78   WhereLoop *pNex
0be0: 74 4c 6f 6f 70 3b 20 2f 2a 20 4e 65 78 74 20 57  tLoop; /* Next W
0bf0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
0c00: 69 6e 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  in the WhereClau
0c10: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  se */.};../*.** 
0c20: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
0c30: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c   this object hol
0c40: 64 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  ds a sequence of
0c50: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
0c60: 74 73 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65  ts.** that imple
0c70: 6d 65 6e 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c  ment some or all
0c80: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 71   of the entire q
0c90: 75 65 72 79 20 70 6c 61 6e 2e 20 20 0a 2a 2f 0a  uery plan.  .*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 50 61 74 68  struct WherePath
0cb0: 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73   {.  Bitmask mas
0cc0: 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20 42 69  kLoop;     /* Bi
0cd0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57 68 65  tmask of all Whe
0ce0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69  reLoop objects i
0cf0: 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a 20  n this path */. 
0d00: 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20   double nRow;   
0d10: 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
0d20: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
0d30: 77 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ws generated by 
0d40: 74 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 64  this path */.  d
0d50: 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20  ouble rCost;    
0d60: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f       /* Total co
0d70: 73 74 20 6f 66 20 74 68 69 73 20 70 61 74 68 20  st of this path 
0d80: 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65  */.  u8 isOrdere
0d90: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  d;         /* Tr
0da0: 75 65 20 69 66 20 74 68 69 73 20 70 61 74 68 20  ue if this path 
0db0: 73 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20  satisfies ORDER 
0dc0: 42 59 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  BY */.  u8 isOrd
0dd0: 65 72 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a  eredValid;    /*
0de0: 20 54 72 75 65 20 69 66 20 74 68 65 20 69 73 4f   True if the isO
0df0: 72 64 65 72 65 64 20 66 69 65 6c 64 20 69 73 20  rdered field is 
0e00: 76 61 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65  valid */.  Where
0e10: 4c 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20  Loop **aLoop;   
0e20: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65   /* Array of Whe
0e30: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69  reLoop objects i
0e40: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
0e50: 20 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   path */.};../*.
0e60: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e  ** The query gen
0e70: 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61  erator uses an a
0e80: 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65  rray of instance
0e90: 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  s of this struct
0ea0: 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69  ure to.** help i
0eb0: 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75  t analyze the su
0ec0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20  bexpressions of 
0ed0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
0ee0: 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a  .  Each WHERE.**
0ef0: 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65   clause subexpre
0f00: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
0f10: 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ed from the othe
0f20: 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74  rs by AND operat
0f30: 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c  ors,.** usually,
0f40: 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75   or sometimes su
0f50: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70  bexpressions sep
0f60: 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a  arated by OR..**
0f70: 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72  .** All WhereTer
0f80: 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64  ms are collected
0f90: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57   into a single W
0fa0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
0fb0: 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66  ture.  .** The f
0fc0: 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74  ollowing identit
0fd0: 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  y holds:.**.**  
0fe0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e        WhereTerm.
0ff0: 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d  pWC->a[WhereTerm
1000: 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65  .idx] == WhereTe
1010: 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  rm.**.** When a 
1020: 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66  term is of the f
1030: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
1040: 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c          X <op> <
1050: 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  expr>.**.** wher
1060: 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e X is a column 
1070: 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73  name and <op> is
1080: 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20   one of certain 
1090: 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68  operators,.** th
10a0: 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66  en WhereTerm.lef
10b0: 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72  tCursor and Wher
10c0: 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75  eTerm.u.leftColu
10d0: 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a  mn record the.**
10e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61   cursor number a
10f0: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  nd column number
1100: 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65   for X.  WhereTe
1110: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63  rm.eOperator rec
1120: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
1130: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
1140: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
1150: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
1160: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
1170: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
1180: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
1190: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
11a0: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
11b0: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
11c0: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
11d0: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
11e0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
11f0: 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20  .** A WhereTerm 
1200: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77  might also be tw
1210: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
1220: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
1230: 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  OR:.**.**       
1240: 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78    (t1.X <op> <ex
1250: 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f  pr>) OR (t1.Y <o
1260: 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e  p> <expr>) OR ..
1270: 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  ...**.** In this
1280: 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74   second case, wt
1290: 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52 4d  Flag as the TERM
12a0: 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64 20  _ORINFO set and 
12b0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
12c0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72  .** and the Wher
12d0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
12e0: 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20  field points to 
12f0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
1300: 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73  ation that.** is
1310: 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75 74   collected about
1320: 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20   the.**.** If a 
1330: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
1340: 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
1350: 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f  t match either o
1360: 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f  f the two previo
1370: 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73  us.** categories
1380: 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72  , then eOperator
1390: 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65 54  ==0.  The WhereT
13a0: 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20  erm.pExpr field 
13b0: 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20  is still set.** 
13c0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
13d0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  subexpression co
13e0: 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67  ntent and wtFlag
13f0: 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70 72  s is set up appr
1400: 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74  opriately.** but
1410: 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73   no other fields
1420: 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65 72   in the WhereTer
1430: 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61  m object are mea
1440: 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57  ningful..**.** W
1450: 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30  hen eOperator!=0
1460: 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e  , prereqRight an
1470: 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f  d prereqAll reco
1480: 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f  rd sets of curso
1490: 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75  r numbers,.** bu
14a0: 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64  t they do so ind
14b0: 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67  irectly.  A sing
14c0: 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  le WhereMaskSet 
14d0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c  structure transl
14e0: 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e  ates.** cursor n
14f0: 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20  umber into bits 
1500: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74  and the translat
1510: 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64  ed bit is stored
1520: 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a   in the prereq.*
1530: 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74  * fields.  The t
1540: 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73  ranslation is us
1550: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ed in order to m
1560: 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62  aximize the numb
1570: 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68  er of.** bits th
1580: 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61  at will fit in a
1590: 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56   Bitmask.  The V
15a0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
15b0: 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73  rs might be.** s
15c0: 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74  pread out over t
15d0: 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  he non-negative 
15e0: 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65  integers.  For e
15f0: 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73  xample, the curs
1600: 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69  or.** numbers mi
1610: 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20  ght be 3, 8, 9, 
1620: 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20  10, 20, 23, 41, 
1630: 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68 65  and 45.  The Whe
1640: 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  reMaskSet.** tra
1650: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
1660: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1670: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1680: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
1690: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
16a0: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
16b0: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
16c0: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
16d0: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
16e0: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
16f0: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
1700: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
1710: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
1720: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
1730: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
1740: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a   0 through 7..**
1750: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
1760: 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69  f terms in a joi
1770: 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  n is limited by 
1780: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
1790: 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52  ts.** in prereqR
17a0: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
17b0: 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  ll.  The default
17c0: 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e   is 64 bits, hen
17d0: 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20  ce SQLite.** is 
17e0: 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f  only able to pro
17f0: 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20  cess joins with 
1800: 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c  64 or fewer tabl
1810: 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  es..*/.struct Wh
1820: 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72  ereTerm {.  Expr
1830: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
1840: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1850: 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  o the subexpress
1860: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69 73  ion that is this
1870: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
1880: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
1890: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57     /* Disable pW
18a0: 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68  C->a[iParent] wh
18b0: 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73  en this term dis
18c0: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c  abled */.  int l
18d0: 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20  eftCursor;      
18e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
18f0: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
1900: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
1910: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74   union {.    int
1920: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
1930: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
1940: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
1950: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
1960: 0a 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  .    WhereOrInfo
1970: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20   *pOrInfo;   /* 
1980: 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  Extra informatio
1990: 6e 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20  n if (eOperator 
19a0: 26 20 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20  & WO_OR)!=0 */. 
19b0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
19c0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
19d0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
19e0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57  if (eOperator& W
19f0: 4f 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d  O_AND)!=0 */.  }
1a00: 20 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61   u;.  u16 eOpera
1a10: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
1a20: 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64   A WO_xx value d
1a30: 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a  escribing <op> *
1a40: 2f 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20  /.  u8 wtFlags; 
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a60: 45 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67  ERM_xxx bit flag
1a70: 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f  s.  See below */
1a80: 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20  .  u8 nChild;   
1a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1aa0: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e  mber of children
1ab0: 20 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62   that must disab
1ac0: 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65  le us */.  Where
1ad0: 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1ae0: 20 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65     /* The clause
1af0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1b00: 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61  rt of */.  Bitma
1b10: 73 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20  sk prereqRight; 
1b20: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
1b30: 20 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20   tables used by 
1b40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f  pExpr->pRight */
1b50: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
1b60: 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69  qAll;      /* Bi
1b70: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
1b80: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 45  referenced by pE
1b90: 78 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  xpr */.};../*.**
1ba0: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
1bb0: 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46  of WhereTerm.wtF
1bc0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1bd0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20  TERM_DYNAMIC    
1be0: 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74  0x01   /* Need t
1bf0: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  o call sqlite3Ex
1c00: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1c10: 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  pr) */.#define T
1c20: 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30  ERM_VIRTUAL    0
1c30: 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62  x02   /* Added b
1c40: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
1c50: 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f    Do not code */
1c60: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f  .#define TERM_CO
1c70: 44 45 44 20 20 20 20 20 20 30 78 30 34 20 20 20  DED      0x04   
1c80: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  /* This term is 
1c90: 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f  already coded */
1ca0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f  .#define TERM_CO
1cb0: 50 49 45 44 20 20 20 20 20 30 78 30 38 20 20 20  PIED     0x08   
1cc0: 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a  /* Has a child *
1cd0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f  /.#define TERM_O
1ce0: 52 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20  RINFO     0x10  
1cf0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65   /* Need to free
1d00: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
1d10: 2e 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20  .pOrInfo object 
1d20: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
1d30: 41 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20  ANDINFO    0x20 
1d40: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65    /* Need to fre
1d50: 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  e the WhereTerm.
1d60: 75 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a  u.pAndInfo obj *
1d70: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f  /.#define TERM_O
1d80: 52 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20  R_OK      0x40  
1d90: 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20   /* Used during 
1da0: 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR-clause proces
1db0: 73 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53  sing */.#ifdef S
1dc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1dd0: 54 33 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52  T3.#  define TER
1de0: 4d 5f 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20  M_VNULL    0x80 
1df0: 20 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65    /* Manufacture
1e00: 64 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e  d x>NULL or x<=N
1e10: 55 4c 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73  ULL term */.#els
1e20: 65 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d  e.#  define TERM
1e30: 5f 56 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20  _VNULL    0x00  
1e40: 20 2f 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20   /* Disabled if 
1e50: 6e 6f 74 20 75 73 69 6e 67 20 73 74 61 74 33 20  not using stat3 
1e60: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
1e70: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1e80: 74 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  the WhereScan ob
1e90: 6a 65 63 74 20 69 73 20 75 73 65 64 20 61 73 20  ject is used as 
1ea0: 61 6e 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  an iterator for 
1eb0: 6c 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d  locating.** term
1ec0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
1ed0: 6c 61 75 73 65 20 74 68 61 74 20 61 72 65 20 75  lause that are u
1ee0: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65  seful to the que
1ef0: 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
1f00: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
1f10: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1f20: 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 2f  Current;       /
1f30: 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 6d 61  * Most recent ma
1f40: 74 63 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  tch */.  WhereCl
1f50: 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20  ause *pOrigWC;  
1f60: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c      /* Original,
1f70: 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65   innermost Where
1f80: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
1f90: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1fa0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43         /* WhereC
1fb0: 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20  lause currently 
1fc0: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
1fd0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61  .  char *zCollNa
1fe0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
1ff0: 20 4d 75 73 74 20 68 61 76 65 20 74 68 69 73 20   Must have this 
2000: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2010: 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ce, if not NULL 
2020: 2a 2f 0a 20 20 63 68 61 72 20 69 64 78 61 66 66  */.  char idxaff
2030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2040: 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68 20 74 68  /* Must match th
2050: 69 73 20 61 66 66 69 6e 69 74 79 2c 20 69 66 20  is affinity, if 
2060: 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20  zCollName!=NULL 
2070: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2080: 61 72 20 6e 45 71 75 69 76 3b 20 20 20 20 20 20  ar nEquiv;      
2090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
20a0: 72 69 65 73 20 69 6e 20 61 45 71 75 69 76 5b 5d  ries in aEquiv[]
20b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
20c0: 68 61 72 20 69 45 71 75 69 76 3b 20 20 20 20 20  har iEquiv;     
20d0: 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20   /* Next unused 
20e0: 73 6c 6f 74 20 69 6e 20 61 45 71 75 69 76 5b 5d  slot in aEquiv[]
20f0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
2100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2110: 20 2f 2a 20 41 63 63 65 70 74 61 62 6c 65 20 6f   /* Acceptable o
2120: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
2130: 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
2140: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2150: 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61 74 20 74  me scanning at t
2160: 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74 68 69 73  his->pWC->a[this
2170: 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 45  ->k] */.  int aE
2180: 71 75 69 76 5b 32 32 5d 3b 20 20 20 20 20 20 20  quiv[22];       
2190: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 2c 43       /* Cursor,C
21a0: 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66 6f 72 20  olumn pairs for 
21b0: 65 71 75 69 76 61 6c 65 6e 63 65 20 63 6c 61 73  equivalence clas
21c0: 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
21d0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
21e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
21f0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c  ructure holds al
2200: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
2210: 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63  out a.** WHERE c
2220: 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74  lause.  Mostly t
2230: 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e  his is a contain
2240: 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  er for one or mo
2250: 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  re WhereTerms..*
2260: 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e  *.** Explanation
2270: 20 6f 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72   of pOuter:  For
2280: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
2290: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
22a0: 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 41 4e  *           a AN
22b0: 44 20 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20  D ((b AND c) OR 
22c0: 28 64 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66  (d AND e)) AND f
22d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
22e0: 20 73 65 70 61 72 61 74 65 20 57 68 65 72 65 43   separate WhereC
22f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f  lause objects fo
2300: 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75  r the whole clau
2310: 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68  se and for.** th
2320: 65 20 73 75 62 63 6c 61 75 73 65 73 20 22 28 62  e subclauses "(b
2330: 20 41 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64   AND c)" and "(d
2340: 20 41 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70   AND e)".  The p
2350: 4f 75 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Outer field of t
2360: 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73  he.** subclauses
2370: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57   points to the W
2380: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
2390: 74 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20  t for the whole 
23a0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63  clause..*/.struc
23b0: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a  t WhereClause {.
23c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
23d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23e0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
23f0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2400: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f  et *pMaskSet;  /
2410: 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62  * Mapping of tab
2420: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
2430: 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f  s to bitmasks */
2440: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2450: 70 4f 75 74 65 72 3b 20 20 20 20 20 2f 2a 20 4f  pOuter;     /* O
2460: 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e  uter conjunction
2470: 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20 20 20   */.  u8 op;    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2490: 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74 6f 72  * Split operator
24a0: 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f  .  TK_AND or TK_
24b0: 4f 52 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  OR */.  u16 wctr
24c0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
24d0: 20 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c 75 64   /* Might includ
24e0: 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  e WHERE_AND_ONLY
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2510: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
2520: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  s */.  int nSlot
2530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2550: 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  ries in a[] */. 
2560: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20   WhereTerm *a;  
2570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
2580: 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20  h a[] describes 
2590: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  a term of the WH
25a0: 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69  ERE cluase */.#i
25b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
25c0: 5f 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20  _SMALL_STACK).  
25d0: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
25e0: 63 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[1];    /* Init
25f0: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
2600: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73   for a[] */.#els
2610: 65 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53  e.  WhereTerm aS
2620: 74 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20  tatic[8];    /* 
2630: 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73  Initial static s
2640: 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a  pace for a[] */.
2650: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2660: 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74   A WhereTerm wit
2670: 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  h eOperator==WO_
2680: 4f 52 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72  OR has its u.pOr
2690: 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74  Info pointer set
26a0: 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63   to.** a dynamic
26b0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69  ally allocated i
26c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
26d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
26e0: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  re..*/.struct Wh
26f0: 65 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68  ereOrInfo {.  Wh
2700: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
2710: 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70         /* Decomp
2720: 6f 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62  osition into sub
2730: 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2740: 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  sk indexable;   
2750: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
2760: 66 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20  f all indexable 
2770: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c  tables in the cl
2780: 61 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ause */.};../*.*
2790: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69  * A WhereTerm wi
27a0: 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  th eOperator==WO
27b0: 5f 41 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70  _AND has its u.p
27c0: 41 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20  AndInfo pointer 
27d0: 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61  set to.** a dyna
27e0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
27f0: 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  d instance of th
2800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2810: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
2820: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a   WhereAndInfo {.
2830: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63    WhereClause wc
2840: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2850: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
2860: 62 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b  broken out */.};
2870: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2880: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2890: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  wing structure k
28a0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20  eeps track of a 
28b0: 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65  mapping.** betwe
28c0: 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  en VDBE cursor n
28d0: 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20  umbers and bits 
28e0: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20  of the bitmasks 
28f0: 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  in WhereTerm..**
2900: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72  .** The VDBE cur
2910: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
2920: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63  small integers c
2930: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20  ontained in .** 
2940: 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75  SrcList_item.iCu
2950: 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54  rsor and Expr.iT
2960: 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f  able fields.  Fo
2970: 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52  r any given WHER
2980: 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68  E .** clause, th
2990: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
29a0: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e   might not begin
29b0: 20 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79   with 0 and they
29c0: 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69   might.** contai
29d0: 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75  n gaps in the nu
29e0: 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65  mbering sequence
29f0: 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74  .  But we want t
2a00: 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a  o make maximum.*
2a10: 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74  * use of the bit
2a20: 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b  s in our bitmask
2a30: 73 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  s.  This structu
2a40: 72 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61  re provides a ma
2a50: 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68  pping.** from th
2a60: 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20  e sparse cursor 
2a70: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e  numbers into con
2a80: 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72  secutive integer
2a90: 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77  s beginning.** w
2aa0: 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ith 0..**.** If 
2ab0: 57 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b  WhereMaskSet.ix[
2ac0: 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74  A]==B it means t
2ad0: 68 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74  hat The A-th bit
2ae0: 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a   of a Bitmask.**
2af0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42   corresponds VDB
2b00: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
2b10: 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74  B.  The A-th bit
2b20: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73   of a bitmask is
2b30: 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   1<<A..**.** For
2b40: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
2b50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
2b60: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68  pression used th
2b70: 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73  ese VDBE.** curs
2b80: 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32  ors:  4, 5, 8, 2
2b90: 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e  9, 57, 73.  Then
2ba0: 20 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53   the  WhereMaskS
2bb0: 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  et structure.** 
2bc0: 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20  would map those 
2bd0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
2be0: 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75  nto bits 0 throu
2bf0: 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  gh 5..**.** Note
2c00: 20 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e   that the mappin
2c10: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
2c20: 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49  rily ordered.  I
2c30: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a  n the example.**
2c40: 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70   above, the mapp
2c50: 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b  ing might go lik
2c60: 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35  e this:  4->3, 5
2c70: 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30  ->1, 8->2, 29->0
2c80: 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e  ,.** 57->5, 73->
2c90: 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31  4.  Or one of 71
2ca0: 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74  9 other combinat
2cb0: 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73  ions might be us
2cc0: 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e  ed. It.** does n
2cd0: 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  ot really matter
2ce0: 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72  .  What is impor
2cf0: 74 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61  tant is that spa
2d00: 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  rse cursor.** nu
2d10: 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61  mbers all get ma
2d20: 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75  pped into bit nu
2d30: 6d 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  mbers that begin
2d40: 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74   with 0 and cont
2d50: 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a  ain.** no gaps..
2d60: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d  */.struct WhereM
2d70: 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e  askSet {.  int n
2d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2da0: 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63  er of assigned c
2db0: 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a  ursor values */.
2dc0: 20 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20    int ix[BMS];  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e  /* Cursor assign
2df0: 65 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a  ed to each bit *
2e00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68  /.};../*.** A Wh
2e10: 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 72  ereCost object r
2e20: 65 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75 70 20  ecords a lookup 
2e30: 73 74 72 61 74 65 67 79 20 61 6e 64 20 74 68 65  strategy and the
2e40: 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 63 6f   estimated.** co
2e50: 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74  st of pursuing t
2e60: 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2f  hat strategy..*/
2e70: 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73  .struct WhereCos
2e80: 74 20 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20  t {.  WherePlan 
2e90: 70 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20  plan;    /* The 
2ea0: 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20  lookup strategy 
2eb0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73  */.  double rCos
2ec0: 74 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 61  t;      /* Overa
2ed0: 6c 6c 20 63 6f 73 74 20 6f 66 20 70 75 72 73 75  ll cost of pursu
2ee0: 69 6e 67 20 74 68 69 73 20 73 65 61 72 63 68 20  ing this search 
2ef0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 42 69  strategy */.  Bi
2f00: 74 6d 61 73 6b 20 75 73 65 64 3b 20 20 20 20 20  tmask used;     
2f10: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 63   /* Bitmask of c
2f20: 75 72 73 6f 72 73 20 75 73 65 64 20 62 79 20 74  ursors used by t
2f30: 68 69 73 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a  his plan */.};..
2f40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
2f50: 74 20 69 73 20 61 20 66 61 63 74 6f 72 79 20 66  t is a factory f
2f60: 6f 72 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  or WhereLoop obj
2f70: 65 63 74 73 20 66 6f 72 20 61 20 70 61 72 74 69  ects for a parti
2f80: 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a 2f 0a  cular query..*/.
2f90: 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70  struct WhereLoop
2fa0: 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68 65 72  Builder {.  Wher
2fb0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2fc0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
2fd0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
2fe0: 57 48 45 52 45 20 2a 2f 0a 20 20 73 71 6c 69 74  WHERE */.  sqlit
2ff0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3000: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3010: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
3030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3040: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3050: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3060: 70 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC;         /* 
3070: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
3080: 6d 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ms */.  SrcList 
3090: 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
30a0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
30b0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
30c0: 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
30d0: 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  /* ORDER BY clau
30e0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  se */.  WhereLoo
30f0: 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
3100: 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
3110: 65 72 65 4c 6f 6f 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ereLoop */.};../
3120: 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f  *.** Bitmasks fo
3130: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  r the operators 
3140: 74 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65  that indices are
3150: 20 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74   able to exploit
3160: 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63  .  An.** OR-ed c
3170: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
3180: 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62  ese values can b
3190: 65 20 75 73 65 64 20 77 68 65 6e 20 73 65 61 72  e used when sear
31a0: 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72  ching for.** ter
31b0: 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 20  ms in the where 
31c0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69  clause..*/.#defi
31d0: 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 30 78 30  ne WO_IN     0x0
31e0: 30 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51  01.#define WO_EQ
31f0: 20 20 20 20 20 30 78 30 30 32 0a 23 64 65 66 69       0x002.#defi
3200: 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f  ne WO_LT     (WO
3210: 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45  _EQ<<(TK_LT-TK_E
3220: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c  Q)).#define WO_L
3230: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
3240: 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_LE-TK_EQ)).#de
3250: 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28  fine WO_GT     (
3260: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b  WO_EQ<<(TK_GT-TK
3270: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
3280: 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _GE     (WO_EQ<<
3290: 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23  (TK_GE-TK_EQ)).#
32a0: 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20  define WO_MATCH 
32b0: 20 30 78 30 34 30 0a 23 64 65 66 69 6e 65 20 57   0x040.#define W
32c0: 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23  O_ISNULL 0x080.#
32d0: 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20  define WO_OR    
32e0: 20 30 78 31 30 30 20 20 20 20 20 20 20 2f 2a 20   0x100       /* 
32f0: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  Two or more OR-c
3300: 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a  onnected terms *
3310: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44  /.#define WO_AND
3320: 20 20 20 20 30 78 32 30 30 20 20 20 20 20 20 20      0x200       
3330: 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41  /* Two or more A
3340: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  ND-connected ter
3350: 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ms */.#define WO
3360: 5f 45 51 55 49 56 20 20 30 78 34 30 30 20 20 20  _EQUIV  0x400   
3370: 20 20 20 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f      /* Of the fo
3380: 72 6d 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f  rm A==B, both co
3390: 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lumns */.#define
33a0: 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30   WO_NOOP   0x800
33b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
33c0: 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73  erm does not res
33d0: 74 72 69 63 74 20 73 65 61 72 63 68 20 73 70 61  trict search spa
33e0: 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57  ce */..#define W
33f0: 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20  O_ALL    0xfff  
3400: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
3410: 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f  all possible WO_
3420: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  * values */.#def
3430: 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78  ine WO_SINGLE 0x
3440: 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  0ff       /* Mas
3450: 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d  k of all non-com
3460: 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65  pound WO_* value
3470: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  s */../*.** Valu
3480: 65 20 66 6f 72 20 77 73 46 6c 61 67 73 20 72 65  e for wsFlags re
3490: 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e  turned by bestIn
34a0: 64 65 78 28 29 20 61 6e 64 20 73 74 6f 72 65 64  dex() and stored
34b0: 20 69 6e 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65   in.** WhereLeve
34c0: 6c 2e 77 73 46 6c 61 67 73 2e 20 20 54 68 65 73  l.wsFlags.  Thes
34d0: 65 20 66 6c 61 67 73 20 64 65 74 65 72 6d 69 6e  e flags determin
34e0: 65 20 77 68 69 63 68 20 73 65 61 72 63 68 0a 2a  e which search.*
34f0: 2a 20 73 74 72 61 74 65 67 69 65 73 20 61 72 65  * strategies are
3500: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
3510: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
3520: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
3530: 30 30 30 30 30 31 20 20 2f 2a 20 72 6f 77 69 64  000001  /* rowid
3540: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
3550: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
3560: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
3570: 41 4e 47 45 20 20 30 78 30 30 30 30 30 30 30 32  ANGE  0x00000002
3580: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
3590: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
35a0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
35b0: 52 45 5f 4e 55 4c 4c 5f 4f 4b 20 20 20 20 20 20  RE_NULL_OK      
35c0: 30 78 30 30 30 30 30 30 30 34 20 20 2f 2a 20 4f  0x00000004  /* O
35d0: 6b 20 74 6f 20 75 73 65 20 57 4f 5f 49 53 4e 55  k to use WO_ISNU
35e0: 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  LL */.#define WH
35f0: 45 52 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20  ERE_IPK         
3600: 20 30 78 30 30 30 30 30 30 30 38 20 20 2f 2a 20   0x00000008  /* 
3610: 78 20 69 73 20 74 68 65 20 49 4e 54 45 47 45 52  x is the INTEGER
3620: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
3630: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
3640: 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30  LUMN_EQ    0x000
3650: 30 30 30 31 30 20 20 2f 2a 20 78 3d 45 58 50 52  00010  /* x=EXPR
3660: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f   or x IN (...) o
3670: 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  r x IS NULL */.#
3680: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
3690: 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30  UMN_RANGE 0x0000
36a0: 30 30 32 30 20 20 2f 2a 20 78 3c 45 58 50 52 20  0020  /* x<EXPR 
36b0: 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f  and/or x>EXPR */
36c0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
36d0: 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30  OLUMN_IN    0x00
36e0: 30 30 30 30 34 30 20 20 2f 2a 20 78 20 49 4e 20  000040  /* x IN 
36f0: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
3700: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
3710: 4c 4c 20 20 30 78 30 30 30 30 30 30 38 30 20 20  LL  0x00000080  
3720: 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  /* x IS NULL */.
3730: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
3740: 44 45 58 45 44 20 20 20 20 20 20 30 78 30 30 30  DEXED      0x000
3750: 30 30 30 66 30 20 20 2f 2a 20 41 6e 79 74 68 69  000f0  /* Anythi
3760: 6e 67 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  ng that uses an 
3770: 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65  index */.#define
3780: 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
3790: 43 41 4e 20 30 78 30 30 30 32 30 30 66 33 20 20  CAN 0x000200f3  
37a0: 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64 6f 20 61  /* Does not do a
37b0: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
37c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
37d0: 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30  E_IN_ABLE      0
37e0: 78 30 30 30 31 30 30 66 31 20 20 2f 2a 20 41 62  x000100f1  /* Ab
37f0: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e  le to support an
3800: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
3810: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f  #define WHERE_TO
3820: 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30  P_LIMIT    0x000
3830: 30 30 31 30 30 20 20 2f 2a 20 78 3c 45 58 50 52  00100  /* x<EXPR
3840: 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73   or x<=EXPR cons
3850: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
3860: 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  e WHERE_BTM_LIMI
3870: 54 20 20 20 20 30 78 30 30 30 30 30 32 30 30 20  T    0x00000200 
3880: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
3890: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
38a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
38b0: 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30  E_BOTH_LIMIT   0
38c0: 78 30 30 30 30 30 33 30 30 20 20 2f 2a 20 42 6f  x00000300  /* Bo
38d0: 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c  th x>EXPR and x<
38e0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
38f0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
3900: 20 20 20 30 78 30 30 30 30 30 34 30 30 20 20 2f     0x00000400  /
3910: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
3920: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
3930: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f  .#define WHERE_O
3940: 52 44 45 52 45 44 20 20 20 20 20 20 30 78 30 30  RDERED      0x00
3950: 30 30 30 38 30 30 20 20 2f 2a 20 4f 75 74 70 75  000800  /* Outpu
3960: 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  t will appear in
3970: 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a   correct order *
3980: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3990: 52 45 56 45 52 53 45 20 20 20 20 20 20 30 78 30  REVERSE      0x0
39a0: 30 30 30 31 30 30 30 20 20 2f 2a 20 53 63 61 6e  0001000  /* Scan
39b0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
39c0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
39d0: 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20  RE_UNIQUE       
39e0: 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20 53  0x00002000  /* S
39f0: 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74  elects no more t
3a00: 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23  han one row */.#
3a10: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 4c 4c  define WHERE_ALL
3a20: 5f 55 4e 49 51 55 45 20 20 20 30 78 30 30 30 30  _UNIQUE   0x0000
3a30: 34 30 30 30 20 20 2f 2a 20 54 68 69 73 20 61 6e  4000  /* This an
3a40: 64 20 61 6c 6c 20 70 72 69 6f 72 20 68 61 76 65  d all prior have
3a50: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66   one row */.#def
3a60: 69 6e 65 20 57 48 45 52 45 5f 4f 42 5f 55 4e 49  ine WHERE_OB_UNI
3a70: 51 55 45 20 20 20 20 30 78 30 30 30 30 38 30 30  QUE    0x0000800
3a80: 30 20 20 2f 2a 20 56 61 6c 75 65 73 20 69 6e 20  0  /* Values in 
3a90: 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73  ORDER BY columns
3aa0: 20 61 72 65 20 0a 20 20 20 20 20 20 20 20 20 20   are .          
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
3ad0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
3ae0: 65 72 79 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ery output row *
3af0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3b00: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30  VIRTUALTABLE 0x0
3b10: 30 30 31 30 30 30 30 20 20 2f 2a 20 55 73 65 20  0010000  /* Use 
3b20: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72  virtual-table pr
3b30: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66  ocessing */.#def
3b40: 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ine WHERE_MULTI_
3b50: 4f 52 20 20 20 20 20 30 78 30 30 30 32 30 30 30  OR     0x0002000
3b60: 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d  0  /* OR using m
3b70: 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20  ultiple indices 
3b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3b90: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78  _TEMP_INDEX   0x
3ba0: 30 30 30 34 30 30 30 30 20 20 2f 2a 20 55 73 65  00040000  /* Use
3bb0: 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  s an ephemeral i
3bc0: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
3bd0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20  WHERE_DISTINCT  
3be0: 20 20 20 30 78 30 30 30 38 30 30 30 30 20 20 2f     0x00080000  /
3bf0: 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20  * Correct order 
3c00: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  for DISTINCT */.
3c10: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
3c20: 56 45 52 5f 53 43 41 4e 20 20 20 30 78 30 30 31  VER_SCAN   0x001
3c30: 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73  00000  /* Full s
3c40: 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e  can of a coverin
3c50: 67 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69  g index */.#defi
3c60: 6e 65 20 57 48 45 52 45 5f 53 49 4e 47 4c 45 5f  ne WHERE_SINGLE_
3c70: 52 4f 57 20 20 20 30 78 30 30 32 30 30 30 30 30  ROW   0x00200000
3c80: 20 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 74 68 61    /* No more tha
3c90: 6e 20 6f 6e 65 20 72 6f 77 20 67 75 61 72 61 6e  n one row guaran
3ca0: 74 65 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  teed */../*.** T
3cb0: 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  his module conta
3cc0: 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72 61 74  ins many separat
3cd0: 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 74 68  e subroutines th
3ce0: 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68 65 72  at work together
3cf0: 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68 65 20   to.** find the 
3d00: 62 65 73 74 20 69 6e 64 69 63 65 73 20 74 6f 20  best indices to 
3d10: 75 73 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  use for accessin
3d20: 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  g a particular t
3d30: 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72 79 2e  able in a query.
3d40: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
3d50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d60: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
3d70: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
3d80: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a  tion about the.*
3d90: 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 73  * index search s
3da0: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
3db0: 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70 61 73   more easily pas
3dc0: 73 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  sed between the 
3dd0: 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75 74 69  various.** routi
3de0: 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  nes..*/.typedef 
3df0: 73 74 72 75 63 74 20 57 68 65 72 65 42 65 73 74  struct WhereBest
3e00: 49 64 78 20 57 68 65 72 65 42 65 73 74 49 64 78  Idx WhereBestIdx
3e10: 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65 42 65  ;.struct WhereBe
3e20: 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73 65 20  stIdx {.  Parse 
3e30: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3e50: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3e60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3e70: 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
3e80: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3e90: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
3ea0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3eb0: 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
3ec0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
3ed0: 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
3ee0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
3ef0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3f00: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
3f10: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
3f20: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
3f30: 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  otValid;        
3f40: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3f50: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
3f60: 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20  for any purpose 
3f70: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3f80: 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
3f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
3fa0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3fb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
3fc0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  inct;           
3fd0: 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c   /* The select-l
3fe0: 69 73 74 20 69 66 20 71 75 65 72 79 20 69 73 20  ist if query is 
3ff0: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 73 71  DISTINCT */.  sq
4000: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
4010: 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20 2f 2a   **ppIdxInfo; /*
4020: 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69   Index informati
4030: 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65  on passed to xBe
4040: 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  stIndex */.  int
4050: 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20 20 20   i, n;          
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4070: 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20 62 65  Which loop is be
4080: 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f 66 20  ing coded; # of 
4090: 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72 65  loops */.  Where
40a0: 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b 20 20  Level *aLevel;  
40b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
40c0: 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72 20 6c  fo about outer l
40d0: 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  oops */.  WhereC
40e0: 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ost cost;       
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
4100: 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
4110: 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lan */.};../*.**
4120: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4130: 74 68 65 20 70 72 6f 62 65 20 63 6f 73 74 20 69  the probe cost i
4140: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
4150: 62 61 73 65 6c 69 6e 65 20 63 6f 73 74 0a 2a 2f  baseline cost.*/
4160: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70  .static int comp
4170: 61 72 65 43 6f 73 74 28 63 6f 6e 73 74 20 57 68  areCost(const Wh
4180: 65 72 65 43 6f 73 74 20 2a 70 50 72 6f 62 65 2c  ereCost *pProbe,
4190: 20 63 6f 6e 73 74 20 57 68 65 72 65 43 6f 73 74   const WhereCost
41a0: 20 2a 70 42 61 73 65 6c 69 6e 65 29 7b 0a 20 20   *pBaseline){.  
41b0: 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43 6f 73  if( pProbe->rCos
41c0: 74 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 72 43 6f  t<pBaseline->rCo
41d0: 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  st ) return 1;. 
41e0: 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43 6f   if( pProbe->rCo
41f0: 73 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e 72 43  st>pBaseline->rC
4200: 6f 73 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ost ) return 0;.
4210: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c    if( pProbe->pl
4220: 61 6e 2e 6e 4f 42 53 61 74 3e 70 42 61 73 65 6c  an.nOBSat>pBasel
4230: 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ine->plan.nOBSat
4240: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
4250: 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61 6e 2e  f( pProbe->plan.
4260: 6e 52 6f 77 3c 70 42 61 73 65 6c 69 6e 65 2d 3e  nRow<pBaseline->
4270: 70 6c 61 6e 2e 6e 52 6f 77 20 29 20 72 65 74 75  plan.nRow ) retu
4280: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
4290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
42a0: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
42b0: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
42c0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
42d0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
42e0: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
42f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4300: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
4310: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
4320: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
4330: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4350: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
4360: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
4370: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f  et *pMaskSet,  /
4380: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
4390: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
43a0: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
43b0: 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
43c0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
43d0: 20 4d 69 67 68 74 20 69 6e 63 6c 75 64 65 20 57   Might include W
43e0: 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f  HERE_AND_ONLY */
43f0: 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73  .){.  pWC->pPars
4400: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
4410: 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d  C->pMaskSet = pM
4420: 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 70  askSet;.  pWC->p
4430: 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43  Outer = 0;.  pWC
4440: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
4450: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
4460: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
4470: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
4480: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
4490: 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
44a0: 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a  = wctrlFlags;.}.
44b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
44c0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
44d0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
44e0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
44f0: 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  e*);../*.** Deal
4500: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
4510: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
4520: 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  h a WhereOrInfo 
4530: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
4540: 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e  c void whereOrIn
4550: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
4560: 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66   *db, WhereOrInf
4570: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
4580: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
4590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
45a0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
45b0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
45c0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
45d0: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
45e0: 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  eAndInfo object.
45f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4600: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
4610: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
4620: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29  WhereAndInfo *p)
4630: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
4640: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
4650: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4660: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
4670: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
4680: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
4690: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
46a0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
46b0: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
46c0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
46d0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
46e0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
46f0: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
4700: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
4710: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
4720: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
4730: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
4740: 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *a;.  sqlite3 *
4750: 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  db = pWC->pParse
4760: 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57  ->db;.  for(i=pW
4770: 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57  C->nTerm-1, a=pW
4780: 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  C->a; i>=0; i--,
4790: 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   a++){.    if( a
47a0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
47b0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
47c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
47d0: 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72  ete(db, a->pExpr
47e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
47f0: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
4800: 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20  RM_ORINFO ){.   
4810: 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65     whereOrInfoDe
4820: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f  lete(db, a->u.pO
4830: 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  rInfo);.    }els
4840: 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73  e if( a->wtFlags
4850: 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20   & TERM_ANDINFO 
4860: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e  ){.      whereAn
4870: 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  dInfoDelete(db, 
4880: 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a  a->u.pAndInfo);.
4890: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
48a0: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
48b0: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
48c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
48d0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
48e0: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
48f0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65   new WhereTerm e
4900: 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72  ntry to the Wher
4910: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
4920: 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57  WC..** The new W
4930: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
4940: 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66  is constructed f
4950: 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77  rom Expr p and w
4960: 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20  ith wtFlags..** 
4970: 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43  The index in pWC
4980: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77  ->a[] of the new
4990: 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65   WhereTerm is re
49a0: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
49b0: 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72  s..** 0 is retur
49c0: 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57  ned if the new W
49d0: 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e  hereTerm could n
49e0: 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20  ot be added due 
49f0: 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  to a memory.** a
4a00: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e  llocation error.
4a10: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
4a20: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  ocation failure 
4a30: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
4a40: 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d   in.** the db->m
4a50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
4a60: 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d   so that higher-
4a70: 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20  level functions 
4a80: 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a  can detect it..*
4a90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4aa0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
4ab0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
4ac0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61  pWC->a[] array a
4ad0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
4ae0: 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67  ** If the wtFlag
4af0: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
4b00: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
4b10: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
4b20: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
4b30: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
4b40: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
4b50: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
4b60: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
4b70: 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20  ** This is true 
4b80: 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75  even if this rou
4b90: 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c  tine fails to al
4ba0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
4bb0: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41  reTerm..**.** WA
4bc0: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
4bd0: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
4be0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
4bf0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
4c00: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
4c10: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
4c20: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
4c30: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
4c40: 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20  fter.** calling 
4c50: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53  this routine.  S
4c60: 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79  uch pointers may
4c70: 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   be reinitialize
4c80: 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67  d by referencing
4c90: 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d  .** the pWC->a[]
4ca0: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
4cb0: 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73  c int whereClaus
4cc0: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
4cd0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
4ce0: 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a  p, u8 wtFlags){.
4cf0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4d00: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
4d10: 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61   testcase( wtFla
4d20: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
4d30: 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30  L );  /* EV: R-0
4d40: 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20  0211-15100 */.  
4d50: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
4d60: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
4d70: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
4d80: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
4d90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
4da0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  C->pParse->db;. 
4db0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
4dc0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4dd0: 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  b, sizeof(pWC->a
4de0: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
4df0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
4e00: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
4e10: 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45  if( wtFlags & TE
4e20: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
4e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4e40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  rDelete(db, p);.
4e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
4e60: 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  C->a = pOld;.   
4e70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4e80: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57   }.    memcpy(pW
4e90: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
4ea0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
4eb0: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
4ec0: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
4ed0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
4ee0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4ef0: 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pOld);.    }.  
4f00: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73    pWC->nSlot = s
4f10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
4f20: 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73  ze(db, pWC->a)/s
4f30: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
4f40: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
4f50: 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57  &pWC->a[idx = pW
4f60: 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70  C->nTerm++];.  p
4f70: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Term->pExpr = sq
4f80: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
4f90: 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d  late(p);.  pTerm
4fa0: 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c  ->wtFlags = wtFl
4fb0: 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57  ags;.  pTerm->pW
4fc0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d  C = pWC;.  pTerm
4fd0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
4fe0: 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a    return idx;.}.
4ff0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5000: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
5010: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
5020: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5030: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
5040: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
5050: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
5060: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
5070: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
5080: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
5090: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
50a0: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
50b0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
50c0: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
50d0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
50e0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
50f0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
5100: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
5110: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
5120: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
5130: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
5140: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
5150: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
5160: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
5170: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
5180: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
5190: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
51a0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
51b0: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
51c0: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
51d0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
51e0: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
51f0: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
5200: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
5210: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
5220: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
5230: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
5240: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
5250: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
5260: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
5270: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
5280: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
5290: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
52a0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
52b0: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20  a[] array.  The 
52c0: 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f  slot[] array gro
52d0: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
52e0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
52f0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
5300: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  E clause..*/.sta
5310: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70  tic void whereSp
5320: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
5330: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
5340: 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57  r, int op){.  pW
5350: 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a  C->op = (u8)op;.
5360: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
5370: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
5380: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a  Expr->op!=op ){.
5390: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
53a0: 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72  nsert(pWC, pExpr
53b0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
53c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
53d0: 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  C, pExpr->pLeft,
53e0: 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53   op);.    whereS
53f0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
5400: 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20  >pRight, op);.  
5410: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
5420: 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73  alize an express
5430: 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20  ion mask set (a 
5440: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
5450: 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ect).*/.#define 
5460: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
5470: 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a  memset(P, 0, siz
5480: 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20  eof(*P))../*.** 
5490: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
54a0: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
54b0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
54c0: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
54d0: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
54e0: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
54f0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
5500: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
5510: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
5520: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
5530: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
5540: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
5550: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
5560: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
5570: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
5580: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
5590: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
55a0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
55b0: 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29  eturn ((Bitmask)
55c0: 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  1)<<i;.    }.  }
55d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
55e0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
55f0: 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73  ew mask for curs
5600: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  or iCursor..**.*
5610: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63  * There is one c
5620: 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20  ursor per table 
5630: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
5640: 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  se.  The number 
5650: 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  of.** tables in 
5660: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5670: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20  is limited by a 
5680: 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68  test early in th
5690: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  e.** sqlite3Wher
56a0: 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65  eBegin() routine
56b0: 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68  .  So we know th
56c0: 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d  at the pMaskSet-
56d0: 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  >ix[].** array w
56e0: 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c  ill never overfl
56f0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
5700: 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68  id createMask(Wh
5710: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
5720: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
5730: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  r){.  assert( pM
5740: 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61  askSet->n < Arra
5750: 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e  ySize(pMaskSet->
5760: 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65  ix) );.  pMaskSe
5770: 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e  t->ix[pMaskSet->
5780: 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a  n++] = iCursor;.
5790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
57a0: 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63  utine walks (rec
57b0: 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70  ursively) an exp
57c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
57d0: 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20   generates.** a 
57e0: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
57f0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  ng which tables 
5800: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74  are used in that
5810: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
5820: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  ree..**.** In or
5830: 64 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75  der for this rou
5840: 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68  tine to work, th
5850: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
5860: 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20  on must have.** 
5870: 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b  previously invok
5880: 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ed sqlite3Resolv
5890: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20  eExprNames() on 
58a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
58b0: 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64   See.** the head
58c0: 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
58d0: 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
58e0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
58f0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71  ation..** The sq
5900: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
5910: 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73  Names() routines
5920: 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d   looks for colum
5930: 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73  n names and.** s
5940: 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65  ets their opcode
5950: 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  s to TK_COLUMN a
5960: 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e 69 54  nd their Expr.iT
5970: 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a  able fields to.*
5980: 2a 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  * the VDBE curso
5990: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
59a0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  table.  This rou
59b0: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
59c0: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68  .** translate th
59d0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
59e0: 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61   into bitmask va
59f0: 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a  lues and OR all.
5a00: 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20  ** the bitmasks 
5a10: 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61  together..*/.sta
5a20: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
5a30: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57  ListTableUsage(W
5a40: 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78  hereMaskSet*, Ex
5a50: 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
5a60: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
5a70: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
5a80: 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c  ereMaskSet*, Sel
5a90: 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ect*);.static Bi
5aa0: 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55  tmask exprTableU
5ab0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
5ac0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
5ad0: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
5ae0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
5af0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
5b00: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
5b10: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
5b20: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
5b30: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
5b40: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
5b50: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
5b60: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
5b70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
5b80: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
5b90: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5ba0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
5bb0: 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  eft);.  if( Expr
5bc0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bd0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
5be0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
5bf0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
5c00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e  (pMaskSet, p->x.
5c10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
5c20: 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  e{.    mask |= e
5c30: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
5c40: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
5c50: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72  .pList);.  }.  r
5c60: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
5c70: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
5c80: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
5c90: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
5ca0: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
5cb0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
5cc0: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
5cd0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
5ce0: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
5cf0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
5d00: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
5d10: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5d20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5d30: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
5d40: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
5d50: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
5d60: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
5d70: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
5d80: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
5d90: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
5da0: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
5db0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68  k mask = 0;.  wh
5dc0: 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53  ile( pS ){.    S
5dd0: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
5de0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73  S->pSrc;.    mas
5df0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
5e00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5e10: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
5e20: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
5e30: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
5e40: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
5e50: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
5e60: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
5e70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5e80: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
5e90: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
5ea0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
5eb0: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
5ec0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
5ed0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
5ee0: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
5ef0: 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  g);.    if( ALWA
5f00: 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20  YS(pSrc!=0) ){. 
5f10: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5f20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
5f30: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
5f40: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
5f50: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
5f60: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5f70: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
5f80: 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  );.        mask 
5f90: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
5fa0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
5fb0: 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
5fc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
5fd0: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
5fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
5ff0: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
6000: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
6010: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
6020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
6030: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
6040: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
6050: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
6060: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
6070: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
6080: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
6090: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
60a0: 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a  ">=", and "IN"..
60b0: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
60c0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36  TION-OF: R-59926
60d0: 2d 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61  -26393 To be usa
60e0: 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ble by an index 
60f0: 61 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a  a term must be.*
6100: 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * of one of the 
6110: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
6120: 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73   column = expres
6130: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78  sion column > ex
6140: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75  pression.** colu
6150: 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e  mn >= expression
6160: 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73   column < expres
6170: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65  sion column <= e
6180: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70  xpression.** exp
6190: 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e  ression = column
61a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f   expression > co
61b0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
61c0: 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70  >= column.** exp
61d0: 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e  ression < column
61e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63   expression <= c
61f0: 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a  olumn column IN.
6200: 2a 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ** (expression-l
6210: 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28  ist) column IN (
6220: 73 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e  subquery) column
6230: 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74   IS NULL.*/.stat
6240: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
6250: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
6260: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
6270: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
6280: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
6290: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
62a0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
62b0: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
62c0: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
62d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
62e0: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
62f0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
6300: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
6310: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
6320: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
6340: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
6350: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
6360: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
6370: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
6380: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
6390: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
63a0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
63b0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
63c0: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
63d0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
63e0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
63f0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
6400: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
6410: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
6420: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
6430: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
6440: 74 69 6e 67 0a 2a 2a 20 73 69 64 65 20 6f 66 20  ting.** side of 
6450: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
6460: 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63  it remains assoc
6470: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
6480: 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a  ame side after.*
6490: 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f  * the commutatio
64a0: 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65  n. So "Y collate
64b0: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
64c0: 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 6f 70 20  comes .** "X op 
64d0: 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  Y". This is beca
64e0: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
64f0: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
6500: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
6510: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
6520: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
6530: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
6540: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
6550: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
6560: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
6570: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
6580: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
6590: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
65a0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
65b0: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
65c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
65d0: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
65e0: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
65f0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
6600: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
6610: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
6620: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
6630: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
6640: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
6650: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
6660: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
6670: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
6680: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
6690: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
66a0: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
66b0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
66c0: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
66d0: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
66e0: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
66f0: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
6700: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
6710: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
6720: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
6730: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
6740: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
6750: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
6760: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
6770: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
6780: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
6790: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
67a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
67b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
67c0: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
67d0: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
67e0: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
67f0: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
6800: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
6810: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
6820: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
6830: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
6840: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
6850: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
6860: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
6870: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
6880: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
6890: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
68a0: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
68b0: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
68c0: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
68d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
68e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
68f0: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
6900: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
6910: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
6920: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
6930: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
6940: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
6950: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
6960: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
6970: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
6980: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
6990: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
69a0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
69b0: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
69c0: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
69d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
69e0: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
69f0: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
6a00: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
6a10: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
6a20: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
6a30: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
6a40: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
6a50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
6a60: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
6a70: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
6a80: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
6a90: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
6aa0: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
6ab0: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
6ac0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
6ad0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
6ae0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
6af0: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
6b00: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
6b10: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
6b20: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
6b30: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
6b40: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
6b50: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
6b60: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
6b70: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
6b80: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
6b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
6ba0: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
6bb0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
6bc0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
6bd0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
6be0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
6bf0: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
6c00: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
6c10: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
6c20: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
6c30: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
6c40: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
6c50: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
6c60: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
6c70: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
6c80: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
6c90: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
6ca0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
6cb0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
6cc0: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
6cd0: 54 65 72 6d 73 2e 0a 2a 2f 0a 57 68 65 72 65 54  Terms..*/.WhereT
6ce0: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65  erm *whereScanNe
6cf0: 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53  xt(WhereScan *pS
6d00: 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  can){.  int iCur
6d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6d20: 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  The cursor on th
6d30: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
6d40: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
6d50: 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  mn;         /* T
6d60: 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  he column on the
6d70: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
6d80: 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f  .  -1 for IPK */
6d90: 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20  .  Expr *pX;    
6da0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
6db0: 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74  pression being t
6dc0: 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ested */.  Where
6dd0: 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
6de0: 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
6df0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20   pScan->pWC */. 
6e00: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
6e10: 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  m;    /* The ter
6e20: 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  m being tested *
6e30: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61  /..  while( pSca
6e40: 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e  n->iEquiv<=pScan
6e50: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
6e60: 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45  iCur = pScan->aE
6e70: 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75  quiv[pScan->iEqu
6e80: 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75  iv-2];.    iColu
6e90: 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  mn = pScan->aEqu
6ea0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
6eb0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
6ec0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
6ed0: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
6ee0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
6ef0: 70 53 63 61 6e 2d 3e 6b 3b 20 70 53 63 61 6e 2d  pScan->k; pScan-
6f00: 3e 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70  >k<pWC->nTerm; p
6f10: 53 63 61 6e 2d 3e 6b 2b 2b 2c 20 70 54 65 72 6d  Scan->k++, pTerm
6f20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6f30: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
6f40: 6f 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72  or==iCur && pTer
6f50: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
6f60: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
6f70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
6f80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6f90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
6fa0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
6fb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
6fc0: 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a  (pScan->aEquiv).
6fd0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
6fe0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
7000: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
7010: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
7020: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
7030: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
7040: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  t( pX->op==TK_CO
7050: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
7060: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7070: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b  Scan->nEquiv; j+
7080: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
7090: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45     if( pScan->aE
70a0: 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61  quiv[j]==pX->iTa
70b0: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
70c0: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71     && pScan->aEq
70d0: 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43  uiv[j+1]==pX->iC
70e0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
70f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7100: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7110: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
7120: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7130: 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  j==pScan->nEquiv
7140: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7150: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
7160: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
7170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7180: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
7190: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
71a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
71b0: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20  Scan->nEquiv += 
71c0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
71d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
71e0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
71f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
7200: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
7210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7220: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
7230: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
7240: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
7250: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
7260: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
7270: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
7280: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7290: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
72b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
72d0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
72f0: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
7300: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63  finityOk(pX, pSc
7310: 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20  an->idxaff) ){. 
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
7330: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7340: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
7360: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7370: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
7380: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
7390: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 57 43 2d  pareCollSeq(pWC-
73a0: 3e 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  >pParse,.       
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
73e0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
73f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7400: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
7410: 70 43 6f 6c 6c 20 3d 20 70 57 43 2d 3e 70 50 61  pColl = pWC->pPa
7420: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
7430: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
7440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7450: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
7460: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
7470: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
7480: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7490: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
74a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
74c0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
74d0: 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20  r & WO_EQ)!=0.  
74e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
74f0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
7500: 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54  ->pRight)->op==T
7510: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
7520: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61        && pX->iTa
7530: 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75  ble==pScan->aEqu
7540: 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  iv[0].          
7550: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
7560: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  n==pScan->aEquiv
7570: 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [1].            
7580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7590: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
75a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
75b0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 43 75 72       pScan->pCur
75c0: 72 65 6e 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20  rent = pTerm;.  
75d0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
75e0: 3e 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  >k++;.          
75f0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
7600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7620: 20 20 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d      pWC = pScan-
7630: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
7640: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
7650: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
7660: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
7670: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
7680: 69 67 57 43 3b 0a 20 20 20 20 70 53 63 61 6e 2d  igWC;.    pScan-
7690: 3e 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  >k = 0;.    pSca
76a0: 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a  n->iEquiv += 2;.
76b0: 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 70 43 75    }.  pScan->pCu
76c0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74  rrent = 0;.  ret
76d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
76e0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45  Initialize a WHE
76f0: 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65  RE clause scanne
7700: 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  r object.  Retur
7710: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
7720: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
7730: 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  h.  Return NULL 
7740: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
7750: 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  matches..**.** T
7760: 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20  he scanner will 
7770: 62 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65  be searching the
7780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57   WHERE clause pW
7790: 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b  C.  It will look
77a0: 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  .** for terms of
77b0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
77c0: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
77d0: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
77e0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20  umn of table.** 
77f0: 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20  iCur.  The <op> 
7800: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
7810: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73  he operators des
7820: 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b  cribed by opMask
7830: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
7840: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
7850: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
7860: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
7870: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
7880: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65  dex pIdx..*/.Whe
7890: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
78a0: 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63  nInit(.  WhereSc
78b0: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
78c0: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61   /* The WhereSca
78d0: 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69  n object being i
78e0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
78f0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7900: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
7910: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
7920: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69  e scanned */.  i
7930: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
7940: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
7950: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
7960: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
7970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
7980: 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  umn to scan for 
7990: 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c  */.  u32 opMask,
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79b0: 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73  Operator(s) to s
79c0: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64  can for */.  Ind
79d0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
79e0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
79f0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7a00: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  this index */.){
7a10: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 6d 65 6d  .  int j;..  mem
7a20: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
7a30: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 0a 20  zeof(*pScan));. 
7a40: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20   pScan->pOrigWC 
7a50: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
7a60: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28  pWC = pWC;.  if(
7a70: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
7a80: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
7a90: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
7aa0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
7ab0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
7ac0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49  .    for(j=0; pI
7ad0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
7ae0: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
7af0: 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
7b00: 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  j>=pIdx->nColumn
7b10: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7b20: 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a    }.    pScan->z
7b30: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d  CollName = pIdx-
7b40: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 0a  >azColl[j];.  }.
7b50: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
7b60: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
7b70: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
7b80: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
7b90: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
7ba0: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
7bb0: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
7bc0: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
7bd0: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
7be0: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
7bf0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
7c00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
7c10: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
7c20: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
7c30: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
7c40: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
7c50: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
7c60: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
7c70: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
7c80: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
7c90: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
7ca0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
7cb0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
7cc0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
7cd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
7ce0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
7cf0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
7d00: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
7d10: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
7d20: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
7d30: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
7d40: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
7d50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
7d60: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
7d70: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
7d80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
7d90: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
7da0: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
7db0: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
7dc0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
7dd0: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
7de0: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
7df0: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
7e00: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
7e10: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
7e20: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
7e30: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
7e40: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
7e50: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
7e60: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
7e70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
7e80: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
7e90: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
7ea0: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
7eb0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
7ec0: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
7ed0: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
7ee0: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
7ef0: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
7f00: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
7f10: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
7f20: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
7f30: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
7f40: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
7f50: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
7f60: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
7f70: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
7f80: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
7f90: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
7fa0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
7fb0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
7fc0: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
7fd0: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
7fe0: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
7ff0: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
8000: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
8010: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
8020: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
8030: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
8040: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
8050: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
8060: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
8070: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
8080: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
8090: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
80a0: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
80b0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
80c0: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
80d0: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
80e0: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
80f0: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
8100: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
8110: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
8120: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
8130: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
8140: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
8150: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
8160: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
8170: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
8180: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
8190: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
81a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
81b0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
81c0: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
81d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
81e0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
81f0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
8200: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
8210: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
8220: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
8230: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
8240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8250: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
8260: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
8270: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
8280: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
8290: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
82a0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
82b0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
82c0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
82d0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
82e0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
82f0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
8300: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
8310: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
8320: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
8330: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
8340: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
8350: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
8360: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
8370: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
8380: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
8390: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
83a0: 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
83b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
83c0: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
83d0: 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d      if( pResult=
83e0: 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70  =0 ) pResult = p
83f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
8400: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
8410: 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  can);.  }.  retu
8420: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
8430: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
8440: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
8450: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
8460: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
8470: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
8480: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
8490: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
84a0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
84b0: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
84c0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
84d0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
84e0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
84f0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
8500: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
8510: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
8520: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
8530: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
8540: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
8550: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
8560: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
8570: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
8580: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
8590: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
85a0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
85b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
85c0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
85d0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
85e0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
85f0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
8600: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
8610: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
8620: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
8630: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
8640: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
8650: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
8660: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
8670: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
8680: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
8690: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
86a0: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
86b0: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
86c0: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
86d0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
86e0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
86f0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
8700: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
8710: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8720: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8730: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
8740: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8750: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
8760: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
8770: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
8780: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
8790: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
87a0: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
87b0: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
87c0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
87d0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
87e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
87f0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
8800: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
8810: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
8820: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
8830: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
8840: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
8850: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
8860: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
8870: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
8880: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
8890: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
88a0: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
88b0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
88c0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
88d0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
88e0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
88f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8900: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8910: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
8920: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
8930: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
8960: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
8970: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8990: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
89a0: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
89b0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
89c0: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
89d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
89e0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
89f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8a00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
8a10: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
8a20: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
8a30: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
8a40: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
8a70: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
8a80: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
8a90: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
8aa0: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
8ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8ac0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
8ad0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
8ae0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
8af0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
8b00: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
8b10: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
8b20: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
8b30: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
8b40: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
8b50: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
8b60: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
8b70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
8b80: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
8b90: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
8ba0: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
8bb0: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
8bc0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
8bd0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
8be0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
8bf0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
8c00: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
8c10: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
8c20: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
8c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8c40: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
8c50: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
8c60: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
8c70: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
8c80: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
8c90: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
8ca0: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
8cb0: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
8cc0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
8cd0: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
8ce0: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
8cf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
8d00: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
8d10: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
8d20: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
8d30: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
8d40: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
8d50: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
8d60: 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
8d70: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
8d80: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
8d90: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
8da0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
8db0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
8dc0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
8dd0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
8de0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8df0: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
8e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8e10: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
8e20: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
8e30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
8e40: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
8e50: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
8e60: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
8e70: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
8e80: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
8e90: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
8ea0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
8eb0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
8ec0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
8ed0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
8ee0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
8ef0: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
8f00: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
8f10: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
8f20: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
8f30: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
8f40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
8f50: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
8f60: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
8f70: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
8f80: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
8f90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
8fa0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
8fb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
8fc0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
8fd0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
8fe0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
8ff0: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
9000: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
9010: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
9020: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9030: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
9040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9050: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
9060: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
9070: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
9080: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
9090: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
90a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
90b0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
90c0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
90d0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
90e0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
90f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
9100: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
9110: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
9120: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
9130: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
9140: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
9150: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
9160: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
9170: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
9180: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
9190: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
91a0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
91b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
91c0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
91d0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
91e0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
91f0: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
9200: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
9210: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
9220: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
9230: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
9240: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
9250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
9260: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
9270: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
9280: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9290: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
92a0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
92b0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
92c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
92d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
92e0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
92f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9300: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9310: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
9320: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
9330: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
9340: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
9350: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
9360: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
9370: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
9380: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9390: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
93a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
93b0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
93c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
93d0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
93e0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
93f0: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
9400: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
9410: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
9420: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
9430: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
9440: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
9450: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
9460: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
9470: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
9480: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
9490: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
94a0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
94b0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
94c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
94d0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
94e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
94f0: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
9500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9510: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
9520: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
9530: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
9540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9550: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
9560: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
9570: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
9580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9590: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
95a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
95b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
95c0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
95d0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
95e0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
95f0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
9600: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
9610: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
9620: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
9630: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
9640: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
9650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
9660: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9670: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
9680: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
9690: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
96a0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
96b0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
96c0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
96d0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
96e0: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
96f0: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
9700: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9710: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
9720: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
9730: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
9740: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
9750: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
9760: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
9770: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
9780: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
9790: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
97a0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
97b0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
97c0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
97d0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
9800: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
9810: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
9820: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
9830: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
9840: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
9850: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
9860: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
9870: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
9880: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
9890: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
98a0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
98b0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
98c0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
98d0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
98e0: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
98f0: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
9900: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
9910: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
9920: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
9930: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
9940: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
9950: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
9960: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
9970: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
9980: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
9990: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
99a0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
99b0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
99c0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
99d0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
99e0: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
99f0: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
9a00: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
9a10: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
9a20: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
9a30: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
9a40: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
9a50: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
9a60: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
9a70: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
9a80: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
9a90: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
9aa0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
9ab0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
9ac0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
9ad0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
9ae0: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
9af0: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
9b00: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
9b10: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
9b20: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
9b30: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
9b40: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
9b50: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
9b60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
9b70: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
9b80: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
9b90: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
9ba0: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
9bb0: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
9bc0: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
9bd0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
9be0: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
9bf0: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
9c00: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
9c10: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
9c20: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
9c30: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
9c40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
9c50: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
9c60: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
9c70: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
9c80: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
9c90: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
9ca0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
9cb0: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
9cc0: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
9cd0: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
9ce0: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
9cf0: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
9d00: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
9d10: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
9d20: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
9d30: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
9d40: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
9d50: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
9d60: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
9d70: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
9d80: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
9d90: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
9da0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
9db0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
9dc0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
9dd0: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
9de0: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
9df0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
9e00: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
9e10: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
9e20: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
9e30: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
9e40: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
9e50: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
9e60: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
9e70: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
9e80: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
9e90: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
9ea0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
9eb0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
9ec0: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
9ed0: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
9ee0: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
9ef0: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
9f00: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
9f10: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
9f20: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
9f30: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
9f40: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
9f50: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
9f60: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
9f70: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
9f80: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
9f90: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
9fa0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
9fb0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
9fc0: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
9fd0: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
9fe0: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
9ff0: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
a000: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
a010: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
a020: 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  * is something t
a030: 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72  he bestIndex() r
a040: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
a050: 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61  rmine.  This ana
a060: 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f  lysis.** only lo
a070: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
a080: 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69  ubterms appropri
a090: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
a0a0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
a0b0: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
a0c0: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c  ough E above all
a0d0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
a0e0: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
a0f0: 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69  ** also statisfi
a100: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
a110: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
a120: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
a130: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
a140: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
a150: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
a160: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
a170: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
a180: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
a190: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
a1a0: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
a1b0: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
a1c0: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
a1d0: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
a1e0: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
a1f0: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
a200: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
a210: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
a220: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
a230: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
a240: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
a250: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
a260: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
a270: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
a280: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
a290: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
a2a0: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
a2b0: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
a2c0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
a2d0: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
a2e0: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
a2f0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
a300: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
a310: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
a320: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
a330: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
a340: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
a350: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
a360: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
a370: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
a380: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
a390: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
a3a0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
a3b0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
a3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
a3d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
a3e0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a3f0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
a400: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
a410: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
a420: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
a430: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a440: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
a450: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a460: 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  /.){.  Parse *pP
a470: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
a480: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
a490: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
a4a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
a4b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
a4e0: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
a4f0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
a500: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
a510: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
a520: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
a530: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
a540: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
a550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a560: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
a570: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  he term */.  Whe
a580: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
a590: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
a5a0: 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73  Set; /* Table us
a5b0: 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74  e masks */.  int
a5c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5e0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a5f0: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
a600: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
a610: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
a620: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
a630: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
a640: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
a650: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
a660: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
a670: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
a680: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
a690: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
a6a0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
a6b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
a6c0: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
a6d0: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
a6e0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
a6f0: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
a700: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
a710: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
a720: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
a730: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
a740: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
a750: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
a760: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
a770: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
a780: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
a790: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
a7a0: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
a7b0: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
a7c0: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
a7d0: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
a7e0: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
a7f0: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
a800: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
a810: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
a820: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
a830: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
a840: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
a850: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
a860: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
a870: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
a880: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
a890: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
a8a0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
a8b0: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
a8c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a8d0: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
a8e0: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
a8f0: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
a900: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a910: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
a920: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
a930: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
a940: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
a950: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
a960: 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74  askSet, pWC->wct
a970: 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68 65 72  rlFlags);.  wher
a980: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
a990: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
a9a0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
a9b0: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
a9c0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
a9d0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
a9e0: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
a9f0: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
aa00: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
aa10: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
aa20: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
aa30: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
aa40: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
aa50: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
aa60: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
aa70: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
aa80: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
aa90: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
aaa0: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
aab0: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
aac0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
aad0: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
aae0: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
aaf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
ab00: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
ab10: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
ab20: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
ab30: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
ab40: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
ab50: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
ab60: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
ab70: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
ab80: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ab90: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
aba0: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
abb0: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
abc0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
abd0: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
abe0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
abf0: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
ac00: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ac10: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
ac20: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
ac30: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
ac40: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
ac50: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
ac60: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
ac70: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
ac80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
ac90: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
aca0: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
acb0: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
acc0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
acd0: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73  ndWC, pWC->pPars
ace0: 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  e, pMaskSet, pWC
acf0: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  ->wctrlFlags);. 
ad00: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
ad10: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
ad20: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
ad30: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
ad40: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
ad50: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
ad60: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
ad70: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
ad80: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
ad90: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ada0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
adb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
adc0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
add0: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
ade0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
adf0: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
ae00: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
ae10: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
ae20: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
ae30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
ae40: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
ae50: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
ae60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
ae70: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
ae80: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
ae90: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
aea0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aeb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
aec0: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
aed0: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
aee0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
aef0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
af00: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
af10: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
af20: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
af30: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
af40: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
af50: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
af60: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
af70: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
af80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
af90: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
afa0: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70     b = getMask(p
afb0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
afc0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
afd0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
afe0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
aff0: 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20  _VIRTUAL ){.    
b000: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
b010: 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e  Other = &pOrWc->
b020: 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65  a[pOrTerm->iPare
b030: 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c  nt];.        b |
b040: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
b050: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
b060: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
b070: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
b080: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
b090: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
b0a0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
b0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
b0c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
b0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
b0e0: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
b0f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b100: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
b110: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
b120: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
b130: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
b140: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
b150: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
b160: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
b170: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
b180: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b190: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
b1a0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
b1b0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
b1c0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
b1d0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
b1e0: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
b1f0: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
b200: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
b210: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
b220: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
b230: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
b240: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
b250: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
b260: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
b270: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
b280: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
b290: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
b2a0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
b2b0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
b2c0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
b2d0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
b2e0: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
b2f0: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
b300: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
b310: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
b320: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
b330: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
b340: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
b350: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
b360: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
b370: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
b380: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
b390: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
b3a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
b3b0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
b3c0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
b3d0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
b3e0: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
b3f0: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
b400: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
b410: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
b420: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
b430: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
b440: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
b450: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
b460: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
b470: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
b480: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
b490: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
b4a0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
b4b0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
b4c0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
b4d0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
b4e0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
b4f0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
b500: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
b510: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
b520: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
b530: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
b540: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
b550: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
b560: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
b570: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
b580: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
b590: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
b5a0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
b5b0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
b5c0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
b5d0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
b5e0: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
b5f0: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
b600: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
b610: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
b620: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
b630: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
b640: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
b650: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
b660: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
b680: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
b690: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
b6a0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
b6b0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
b6c0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
b6d0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
b6e0: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
b6f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b700: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b710: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
b720: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
b730: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
b740: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
b750: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
b760: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
b770: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
b780: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
b790: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
b7a0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
b7b0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
b7c0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
b7d0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
b7e0: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
b7f0: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
b800: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
b810: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
b820: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
b830: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
b840: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
b850: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
b860: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
b870: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
b880: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
b890: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
b8a0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
b8b0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
b8c0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
b8d0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
b8e0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
b8f0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
b900: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
b910: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
b920: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
b930: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b940: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
b950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
b960: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
b970: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
b980: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
b990: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
b9a0: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
b9b0: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
b9c0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
b9d0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
b9e0: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
b9f0: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
ba00: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
ba10: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
ba20: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
ba30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
ba40: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
ba50: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
ba60: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d  oIN & getMask(pM
ba70: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
ba80: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
ba90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
baa0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
bab0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
bac0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
bad0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
bae0: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
baf0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
bb00: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
bb10: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
bb20: 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20  preceeded.      
bb30: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
bb40: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
bb50: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
bb60: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
bb70: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
bb80: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
bb90: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
bba0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bbb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
bbc0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
bbd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
bbe0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
bbf0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
bc00: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
bc10: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
bc20: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
bc30: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
bc40: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
bc50: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
bc60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bc70: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
bc80: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
bc90: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
bca0: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
bcb0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
bcc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bcd0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
bce0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
bcf0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
bd00: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
bd10: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
bd20: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
bd30: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
bd40: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
bd50: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
bd60: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
bd70: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
bd80: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
bd90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
bda0: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
bdb0: 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  (pMaskSet, iCurs
bdc0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
bdd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bde0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
bdf0: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
be00: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
be10: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
be20: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
be30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
be40: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
be50: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
be60: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
be70: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
be80: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
be90: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
bea0: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
beb0: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
bec0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
bed0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
bee0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
bef0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
bf00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
bf10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
bf20: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
bf30: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
bf40: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
bf50: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
bf60: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
bf70: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
bf80: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
bf90: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
bfa0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
bfb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bfc0: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
bfd0: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
bfe0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
bff0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
c000: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
c010: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
c020: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
c030: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
c040: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
c050: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
c060: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
c070: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
c080: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
c090: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
c0a0: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
c0b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c0c0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
c0d0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
c0e0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
c0f0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
c100: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
c110: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
c120: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
c130: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
c140: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
c150: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
c160: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
c170: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
c180: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
c190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c1a0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
c1b0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
c1c0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
c1d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c1e0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
c1f0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
c200: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
c210: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
c220: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
c230: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
c240: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
c250: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
c260: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
c270: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
c280: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
c290: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
c2a0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
c2b0: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
c2c0: 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  0.    */.    if(
c2d0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
c2e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
c2f0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
c300: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
c310: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
c320: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
c330: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
c340: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
c350: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
c360: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
c370: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
c380: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
c390: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
c3a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c3b0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
c3c0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
c3d0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
c3e0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
c3f0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
c400: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
c410: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c420: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
c430: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
c440: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
c450: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
c460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
c470: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
c480: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
c490: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
c4a0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
c4b0: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
c4c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
c4d0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c4e0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
c4f0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
c500: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c510: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
c520: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
c530: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
c540: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c550: 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  d(pWC->pParse, p
c560: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
c570: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
c580: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
c590: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
c5a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
c5b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
c5c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c5d0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
c5e0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
c5f0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c600: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
c610: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
c620: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
c630: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
c640: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
c650: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
c660: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
c670: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
c680: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
c690: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c6a0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
c6b0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
c6c0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
c6d0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c6e0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
c6f0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c700: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
c710: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
c720: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
c730: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
c740: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
c750: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
c760: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c770: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
c780: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
c790: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c7a0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c7b0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
c7c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
c7d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c7e0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
c7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
c800: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
c810: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
c820: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
c830: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
c840: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
c850: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
c860: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
c870: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
c880: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
c890: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
c8a0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
c8b0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
c8c0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
c8d0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
c8e0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
c8f0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
c900: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
c910: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
c920: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
c930: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
c940: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
c950: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
c960: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
c970: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c980: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
c990: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
c9a0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
c9b0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
c9c0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
c9d0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
c9e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c9f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
ca00: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
ca10: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
ca20: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
ca30: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
ca40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
ca50: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
ca60: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
ca70: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
ca80: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
ca90: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
caa0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
cab0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
cac0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
cad0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
cae0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
caf0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
cb00: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
cb10: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
cb20: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
cb30: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
cb40: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
cb50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
cb60: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
cb70: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
cb80: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
cb90: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
cba0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
cbb0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
cbc0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
cbd0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
cbe0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
cbf0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
cc00: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
cc10: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
cc20: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
cc30: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
cc40: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
cc50: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
cc60: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
cc70: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
cc80: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
cc90: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
cca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ccb0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
ccc0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
ccd0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
cce0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
ccf0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
cd00: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
cd10: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
cd20: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
cd30: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
cd40: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
cd50: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
cd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
cd80: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
cd90: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
cda0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdc0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
cdd0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
cde0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
cdf0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
ce10: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
ce20: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
ce30: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
ce40: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
ce50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
ce60: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
ce70: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
cea0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
ceb0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
cec0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
ced0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
cee0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
cef0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
cf00: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
cf30: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
cf40: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
cf70: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
cf80: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
cf90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
cfa0: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
cfb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cfc0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
cfd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cfe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
cff0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
d000: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
d010: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d020: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
d030: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
d040: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
d050: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
d060: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
d070: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61  Term->pExpr;.  a
d080: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
d090: 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72  !=TK_AS && pExpr
d0a0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op!=TK_COLLATE
d0b0: 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74   );.  prereqLeft
d0c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
d0d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
d0e0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
d0f0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
d100: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
d110: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d120: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
d130: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
d140: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d150: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
d160: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
d170: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
d180: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
d190: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
d1a0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
d1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
d1c0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d1d0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
d1e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
d1f0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
d200: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
d210: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
d220: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
d230: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
d240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
d250: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
d260: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
d270: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
d280: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
d290: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
d2a0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
d2b0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
d2c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
d2d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
d2e0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
d2f0: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
d300: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
d310: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
d320: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
d330: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
d340: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
d350: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
d360: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
d370: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
d380: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
d390: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
d3a0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
d3b0: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
d3c0: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
d3d0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
d3e0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
d3f0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
d400: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
d410: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
d420: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
d430: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
d440: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20  lowedOp(op) ){. 
d450: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
d460: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
d470: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
d480: 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20  Left);.    Expr 
d490: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
d4a0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
d4b0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
d4c0: 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20  .    u16 opMask 
d4d0: 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
d4e0: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
d4f0: 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20  ft)==0 ? WO_ALL 
d500: 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  : WO_EQUIV;.    
d510: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
d520: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
d530: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
d540: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
d550: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
d560: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
d570: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
d580: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
d590: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
d5a0: 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d  orMask(op) & opM
d5b0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ask;.    }.    i
d5c0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
d5d0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
d5e0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
d5f0: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
d600: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
d610: 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f       u16 eExtraO
d620: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
d630: 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20   Extra bits for 
d640: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
d650: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  */.      if( pTe
d660: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
d670: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
d680: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
d690: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
d6a0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
d6b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
d6c0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d6d0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
d6e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d6f0: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
d700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
d710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d720: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
d730: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
d740: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
d750: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
d760: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d770: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
d780: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
d790: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
d7a0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
d7b0: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
d7c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
d7d0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
d7e0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
d7f0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
d800: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
d810: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
d820: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20  COPIED;.        
d830: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
d840: 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26  K_EQ.         &&
d850: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
d860: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
d870: 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26  Join).         &
d880: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
d890: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
d8a0: 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20  _Transitive).   
d8b0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
d8c0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
d8d0: 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a  or |= WO_EQUIV;.
d8e0: 20 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61            eExtra
d8f0: 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  Op = WO_EQUIV;. 
d900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
d920: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
d930: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
d940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d950: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
d960: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
d970: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
d980: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
d990: 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pDup->pLeft);.  
d9a0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
d9b0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
d9c0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
d9d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
d9e0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
d9f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
da00: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
da10: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
da20: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
da30: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
da40: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
da50: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
da60: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
da70: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
da80: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
da90: 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61  perator = (opera
daa0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
dab0: 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20  ) + eExtraOp) & 
dac0: 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  opMask;.    }.  
dad0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
dae0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
daf0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
db00: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
db10: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
db20: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
db30: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
db40: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
db50: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
db60: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
db70: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
db80: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
db90: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
dba0: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
dbb0: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
dbc0: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
dbd0: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
dbe0: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
dbf0: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
dc00: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
dc10: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
dc20: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
dc30: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
dc40: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
dc50: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
dc60: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
dc70: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
dc80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
dc90: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
dca0: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
dcb0: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
dcc0: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
dcd0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
dce0: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
dcf0: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
dd00: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
dd10: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
dd20: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
dd30: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
dd40: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
dd50: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
dd60: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
dd70: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
dd80: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
dd90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
dda0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
ddb0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
ddc0: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
ddd0: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
dde0: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
ddf0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
de00: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
de10: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
de20: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
de30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
de40: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
de50: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
de60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
de70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
de80: 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  ops[i], .       
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
deb0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
dec0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
def0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
df00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
df10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
df20: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
df30: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
df40: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
df50: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
df60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
df70: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
df80: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
df90: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
dfa0: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
dfb0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
dfc0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
dfd0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
dfe0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
dff0: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
e000: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
e010: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e020: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
e030: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
e040: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e050: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
e060: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
e070: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
e080: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
e090: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
e0a0: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
e0b0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
e0c0: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
e0d0: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
e0e0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
e0f0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
e100: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
e110: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
e120: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
e130: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
e140: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
e150: 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
e160: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
e170: 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m];.  }.#endif /
e180: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
e190: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
e1a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e1b0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
e1c0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
e1d0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
e1e0: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
e1f0: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
e200: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
e210: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
e220: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
e230: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
e240: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
e250: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
e260: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
e270: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
e280: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
e290: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
e2a0: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
e2b0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
e2c0: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
e2d0: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
e2e0: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
e2f0: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
e300: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
e310: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  ..  */.  if( pWC
e320: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20  ->op==TK_AND .  
e330: 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62   && isLikeOrGlob
e340: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
e350: 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c  &pStr1, &isCompl
e360: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20  ete, &noCase).  
e370: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
e380: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ft;       /* LHS
e390: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
e3a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
e3b0: 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20  pr *pStr2;      
e3c0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72   /* Copy of pStr
e3d0: 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f  1 - RHS of LIKE/
e3e0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
e3f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
e400: 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a  xpr1;.    Expr *
e410: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
e420: 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20  nt idxNew1;.    
e430: 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20  int idxNew2;.   
e440: 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e   Token sCollSeqN
e450: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
e460: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e470: 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  nce */..    pLef
e480: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
e490: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
e4a0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
e4b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
e4c0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
e4d0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
e4e0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
e4f0: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
e500: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
e510: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
e520: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
e530: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
e540: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
e550: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
e560: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
e570: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
e580: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
e590: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
e5a0: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
e5b0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
e5c0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
e5d0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
e5e0: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
e5f0: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
e600: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
e610: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
e620: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
e630: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
e640: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
e650: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
e660: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
e670: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
e680: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
e690: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
e6a0: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
e6b0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
e6c0: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
e6d0: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
e6e0: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
e6f0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
e700: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e710: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
e720: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
e730: 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34  0;   /* EV: R-64
e740: 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20  339-08207 */... 
e750: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
e760: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
e770: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
e780: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
e790: 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71    }.    sCollSeq
e7a0: 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20  Name.z = noCase 
e7b0: 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49  ? "NOCASE" : "BI
e7c0: 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c  NARY";.    sColl
e7d0: 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20  SeqName.n = 6;. 
e7e0: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
e7f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
e800: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
e810: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
e820: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
e830: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e850: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
e860: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
e870: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
e880: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
e890: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
e8a0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
e8b0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
e8c0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
e8d0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
e8e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
e8f0: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
e900: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
e910: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
e920: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
e930: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
e940: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
e950: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
e960: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
e970: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
e980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e990: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
e9a0: 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ken(pParse,pNewE
e9b0: 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61  xpr2,&sCollSeqNa
e9c0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
e9d0: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
e9e0: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
e9f0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ea00: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
ea10: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
ea20: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
ea30: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
ea40: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
ea50: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
ea60: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
ea70: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
ea80: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
ea90: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
eaa0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
eab0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
eac0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
ead0: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
eae0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
eaf0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
eb00: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
eb10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
eb20: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
eb30: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
eb40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
eb50: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
eb60: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
eb70: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
eb80: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
eb90: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
eba0: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
ebb0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
ebc0: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
ebd0: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
ebe0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
ebf0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
ec00: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
ec10: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
ec20: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
ec30: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
ec40: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
ec50: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
ec60: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
ec70: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
ec80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
ec90: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
eca0: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
ecb0: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
ecc0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
ecd0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
ece0: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
ecf0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
ed00: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
ed10: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
ed20: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
ed30: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
ed40: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
ed50: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
ed60: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
ed70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ed80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
ed90: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
eda0: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
edb0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
edc0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
edd0: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
ede0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
edf0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
ee00: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
ee10: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
ee20: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
ee30: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
ee60: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
ee70: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
ee80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
ee90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
eea0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
eeb0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
eec0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
eed0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
eee0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
eef0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ef00: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
ef10: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
ef20: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
ef30: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ef40: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ef50: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
ef60: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
ef70: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ef80: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ef90: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
efa0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
efb0: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
efc0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
efd0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
efe0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
eff0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
f000: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
f010: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
f020: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
f030: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
f040: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
f050: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
f060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f080: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
f090: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
f0a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
f0b0: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
f0c0: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
f0d0: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
f0e0: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
f0f0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
f100: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
f110: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
f120: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
f130: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
f140: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
f150: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
f160: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
f170: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
f180: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
f190: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
f1a0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
f1b0: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
f1c0: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
f1d0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
f1e0: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
f1f0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
f200: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
f210: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
f220: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
f230: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
f240: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
f250: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
f260: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
f270: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
f280: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
f290: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
f2a0: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
f2b0: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
f2c0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
f2d0: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
f2e0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
f2f0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
f300: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
f310: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
f320: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
f330: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
f340: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
f350: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
f360: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
f370: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
f380: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
f390: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
f3a0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f3d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
f3e0: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
f410: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
f420: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
f430: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
f440: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
f450: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
f480: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
f490: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
f4a0: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
f4b0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
f4c0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
f4d0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
f4e0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
f4f0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
f500: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
f510: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
f520: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
f530: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
f540: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
f550: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
f560: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
f570: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
f580: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
f590: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
f5a0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
f5b0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
f5c0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
f5d0: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
f5e0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
f5f0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
f600: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
f610: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
f620: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
f630: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f640: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f  E_ENABLE_STAT */
f650: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
f660: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
f670: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
f680: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
f690: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
f6a0: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
f6b0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
f6c0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
f6d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f6e0: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
f6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f700: 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
f710: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
f720: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
f730: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
f740: 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78  ent.** for an ex
f750: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65  pression of type
f760: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20   TK_COLUMN that 
f770: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 61  refers to the sa
f780: 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a  me column and.**
f790: 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63   uses the same c
f7a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
f7b0: 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68  e as the iCol'th
f7c0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
f7d0: 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65   pIdx..** Argume
f7e0: 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65 20  nt iBase is the 
f7f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73  cursor number us
f800: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
f810: 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65 72   that pIdx refer
f820: 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49  s.** to..**.** I
f830: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
f840: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
f850: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
f860: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
f870: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
f880: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
f890: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
f8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8b0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
f8c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
f8f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f900: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
f910: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
f920: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
f930: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
f940: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f950: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
f960: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
f970: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
f980: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
f990: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
f9a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
f9b0: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
f9c0: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
f9f0: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
fa00: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
fa10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
fa20: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
fa30: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
fa40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
fa50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
fa60: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
fa70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
fa80: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
fa90: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
faa0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
fab0: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
fac0: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
fad0: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
fae0: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
faf0: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
fb00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
fb10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
fb20: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
fb30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
fb40: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
fb50: 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c  pColl) && 0==sql
fb60: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
fb70: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
fb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fb90: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
fba0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fbb0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n -1;.}../*.** T
fbc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65  his routine dete
fbd0: 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63  rmines if pIdx c
fbe0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73  an be used to as
fbf0: 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69  sist in processi
fc00: 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54  ng a.** DISTINCT
fc10: 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f   qualifier. In o
fc20: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74  ther words, it t
fc30: 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20  ests whether or 
fc40: 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a  not using this.*
fc50: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
fc60: 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61  outer loop guara
fc70: 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20  ntees that rows 
fc80: 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65  with equal value
fc90: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70  s for.** all exp
fca0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
fcb0: 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61  pDistinct list a
fcc0: 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f  re delivered gro
fcd0: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a  uped together..*
fce0: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
fcf0: 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a  , the query .**.
fd00: 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  **   SELECT DIST
fd10: 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  INCT a, b, c FRO
fd20: 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
fd30: 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65  ?.**.** can bene
fd40: 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64  fit from any ind
fd50: 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62  ex on columns "b
fd60: 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74  " and "c"..*/.st
fd70: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
fd80: 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  nctIndex(.  Pars
fd90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fdb0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
fdc0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
fdd0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
fde0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
fdf0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64   clause */.  Ind
fe00: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe20: 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
fe30: 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20  considered */.  
fe40: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
fe70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70   for the table p
fe80: 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45  Idx is on */.  E
fe90: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
fea0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
feb0: 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65  * The DISTINCT e
fec0: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
fed0: 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20  int nEqCol      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
ff00: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
ff10: 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  == */.){.  Bitma
ff20: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20  sk mask = 0;    
ff30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
ff40: 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65  sk of unaccounte
ff50: 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20  d for pDistinct 
ff60: 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  exprs */.  int i
ff70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ff80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
ff90: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
ffa0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
ffb0: 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
ffc0: 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d  if( pIdx->zName=
ffd0: 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d  =0 || pDistinct-
ffe0: 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 72 65  >nExpr>=BMS ) re
fff0: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
10000 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e  se( pDistinct->n
10010 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a  Expr==BMS-1 );..
10020 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
10030 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  h all the expres
10040 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 69 73  sions in the dis
10050 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66 20 61  tinct list. If a
10060 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20  ny of them.  ** 
10070 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63  are not simple c
10080 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
10090 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
100a0 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73 74 20  Otherwise, test 
100b0 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
100c0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
100d0 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75  s a "col=X" clau
100e0 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  se. If it does, 
100f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
10100 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   ** can be ignor
10110 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  ed. If it does n
10120 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ot, and the colu
10130 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  mn does not belo
10140 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  ng to the.  ** s
10150 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69 6e 64  ame table as ind
10160 65 78 20 70 49 64 78 2c 20 72 65 74 75 72 6e 20  ex pIdx, return 
10170 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20  early. Finally, 
10180 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  if there is no. 
10190 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22 63 6f   ** matching "co
101a0 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f 6e 20  l=X" expression 
101b0 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  and the column i
101c0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  s on the same ta
101d0 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20 20 2a  ble as pIdx,.  *
101e0 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 73  * set the corres
101f0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 76  ponding bit in v
10200 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20  ariable mask..  
10210 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10220 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
10230 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ; i++){.    Wher
10240 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
10250 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
10260 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
10270 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
10280 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
10290 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  f( p->op!=TK_COL
102a0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
102b0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
102c0 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61  Term(pWC, p->iTa
102d0 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c  ble, p->iColumn,
102e0 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
102f0 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _EQ, 0);.    if(
10300 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
10310 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
10320 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
10330 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71 6c  ollSeq *p1 = sql
10340 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
10350 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
10360 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
10370 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 43  pRight);.      C
10380 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71 6c  ollSeq *p2 = sql
10390 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
103a0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
103b0 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20 63    if( p1==p2 ) c
103c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
103d0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
103e0 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e 20  !=base ) return 
103f0 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28  0;.    mask |= (
10400 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
10410 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  i);.  }..  for(i
10420 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26  =nEqCol; mask &&
10430 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
10440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
10450 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64 65  iExpr = findInde
10460 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
10470 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70 49  stinct, base, pI
10480 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  dx, i);.    if( 
10490 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b 3b  iExpr<0 ) break;
104a0 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28  .    mask &= ~((
104b0 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69  (Bitmask)1) << i
104c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Expr);.  }..  re
104d0 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a  turn (mask==0);.
104e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
104f0 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
10500 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
10510 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
10520 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
10530 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
10540 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c  nt. A DISTINCT l
10550 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
10560 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
10570 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55   contains a.** U
10580 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74  NIQUE index that
10590 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
105a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
105b0 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65  he query will be
105c0 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79   distinct.** any
105d0 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  way..*/.static i
105e0 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
105f0 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
10600 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69  *pParse,.  SrcLi
10610 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20  st *pTabList,.  
10620 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
10630 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  ,.  ExprList *pD
10640 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62  istinct.){.  Tab
10650 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
10660 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
10670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10680 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
10690 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
106a0 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
106b0 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
106c0 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
106d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
106e0 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
106f0 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
10700 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
10710 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
10720 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
10730 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
10740 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
10750 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
10760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10770 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
10780 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
10790 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
107a0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
107b0 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
107c0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
107d0 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
107e0 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
107f0 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
10800 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
10810 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
10820 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
10830 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
10840 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
10850 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
10860 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
10870 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
10880 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
10890 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
108a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
108b0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
108c0 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
108d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
108e0 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
108f0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
10900 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
10910 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
10920 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
10930 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
10940 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
10950 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
10960 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
10970 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
10980 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
10990 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
109a0 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
109b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
109c0 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
109d0 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
109e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
109f0 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
10a00 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
10a10 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
10a20 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
10a30 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
10a40 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
10a50 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
10a60 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
10a70 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
10a80 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
10a90 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
10aa0 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
10ab0 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
10ac0 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
10ad0 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
10ae0 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
10af0 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
10b00 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
10b10 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
10b20 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
10b30 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
10b40 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
10b50 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
10b60 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
10b70 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
10b80 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
10b90 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
10ba0 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
10bb0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
10bc0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
10bd0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10be0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
10bf0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
10c00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
10c10 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
10c20 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
10c30 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10c40 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
10c50 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
10c60 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
10c70 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
10c80 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
10c90 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
10ca0 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
10cb0 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
10cc0 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
10cd0 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
10ce0 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
10cf0 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
10d00 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
10d10 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  [i]].notNull==0 
10d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
10d30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10d50 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
10d60 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lumn ){.      /*
10d70 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
10d80 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
10d90 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
10da0 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
10db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
10dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10dd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10de0 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
10df0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
10e00 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
10e10 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
10e20 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
10e30 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
10e40 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
10e50 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
10e60 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
10e70 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
10e80 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
10e90 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
10ea0 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
10eb0 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
10ec0 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
10ed0 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
10ee0 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
10ef0 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
10f00 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
10f10 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
10f20 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
10f30 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
10f40 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
10f50 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
10f60 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
10f70 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
10f80 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
10f90 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
10fa0 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
10fb0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
10fc0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10fd0 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
10fe0 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
10ff0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
11000 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
11010 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
11020 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
11030 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
11040 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
11050 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
11060 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
11070 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11080 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
11090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
110a0 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
110b0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
110c0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
110d0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
110e0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
110f0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
11100 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
11110 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
11120 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
11130 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11140 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
11150 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
11160 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
11170 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
11180 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
11190 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
111a0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
111b0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
111c0 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
111d0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
111e0 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
111f0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
11200 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
11210 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
11220 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11230 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11240 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
11250 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
11260 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
11270 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
11280 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
11290 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
112a0 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
112b0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
112c0 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
112d0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
112e0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
112f0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
11300 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
11310 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
11320 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
11330 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
11340 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11350 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
11360 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
11370 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
11380 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
11390 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
113a0 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
113b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
113c0 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
113d0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
113e0 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
113f0 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
11400 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
11410 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
11420 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
11430 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
11440 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
11450 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
11460 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
11470 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
11480 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
11490 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
114a0 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
114b0 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
114c0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
114d0 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
114e0 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
114f0 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
11500 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
11510 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
11520 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
11530 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
11540 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
11550 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
11560 28 57 68 65 72 65 42 65 73 74 49 64 78 2a 29 3b  (WhereBestIdx*);
11570 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11580 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
11590 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
115a0 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
115b0 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
115c0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
115d0 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
115e0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
115f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
11600 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
11610 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11620 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
11630 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
11640 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
11650 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
11660 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11680 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
11690 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
116a0 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
116b0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
116c0 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65 72 65  MIZATION.  Where
116d0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
116e0 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  >pWC;           
116f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11700 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
11710 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11720 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a  rc = p->pSrc; /*
11730 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
11740 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
11750 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
11760 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
11770 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  sor;      /* The
11780 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
11790 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  able  */.  const
117a0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63   Bitmask maskSrc
117b0 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
117c0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
117d0 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72    /* Bitmask for
117e0 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
117f0 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43  Term * const pWC
11800 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
11810 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20  C->nTerm];      
11820 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11830 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54  >a[] */.  WhereT
11840 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11860 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
11870 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
11880 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  use */..  /* The
11890 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d   OR-clause optim
118a0 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 6c  ization is disal
118b0 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44  lowed if the IND
118c0 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20  EXED BY or.  ** 
118d0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
118e0 73 65 73 20 61 72 65 20 75 73 65 64 20 6f 72 20  ses are used or 
118f0 69 66 20 74 68 65 20 57 48 45 52 45 5f 41 4e 44  if the WHERE_AND
11900 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73 65 74  _ONLY bit is set
11910 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  . */.  if( pSrc-
11920 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70  >notIndexed || p
11930 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29  Src->pIndex!=0 )
11940 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11950 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74  }.  if( pWC->wct
11960 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
11970 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  AND_ONLY ){.    
11980 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
11990 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45  * Search the WHE
119a0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
119b0 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f  for a usable WO_
119c0 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  OR term. */.  fo
119d0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
119e0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
119f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
11a00 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
11a10 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
11a20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70     && ((pTerm->p
11a30 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b  rereqAll & ~mask
11a40 53 72 63 29 20 26 20 70 2d 3e 6e 6f 74 52 65 61  Src) & p->notRea
11a50 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  dy)==0.     && (
11a60 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
11a70 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61  ->indexable & ma
11a80 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29  skSrc)!=0 .    )
11a90 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
11aa0 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
11ab0 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
11ac0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
11ad0 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
11ae0 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
11af0 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
11b00 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
11b10 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
11b20 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54  .      double rT
11b30 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
11b40 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b  double nRow = 0;
11b50 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75  .      Bitmask u
11b60 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 57  sed = 0;.      W
11b70 68 65 72 65 42 65 73 74 49 64 78 20 73 42 4f 49  hereBestIdx sBOI
11b80 3b 0a 0a 20 20 20 20 20 20 73 42 4f 49 20 3d 20  ;..      sBOI = 
11b90 2a 70 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70  *p;.      sBOI.p
11ba0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
11bb0 20 20 20 73 42 4f 49 2e 70 44 69 73 74 69 6e 63     sBOI.pDistinc
11bc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f  t = 0;.      sBO
11bd0 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b  I.ppIdxInfo = 0;
11be0 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
11bf0 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
11c00 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
11c10 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
11c20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28     /*WHERETRACE(
11c30 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65  ("... Multi-inde
11c40 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72  x OR testing for
11c50 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e   term %d of %d..
11c60 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  ..\n", .        
11c70 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72    (pOrTerm - pOr
11c80 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d  WC->a), (pTerm -
11c90 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20   pWC->a).       
11ca0 20 29 29 3b 2a 2f 0a 20 20 20 20 20 20 20 20 69   ));*/.        i
11cb0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
11cc0 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
11cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11ce0 73 42 4f 49 2e 70 57 43 20 3d 20 26 70 4f 72 54  sBOI.pWC = &pOrT
11cf0 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
11d00 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >wc;.          b
11d10 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b  estIndex(&sBOI);
11d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11d30 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
11d40 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
11d50 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
11d60 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
11d70 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
11d80 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
11d90 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
11da0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
11db0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
11dc0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
11dd0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
11de0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
11df0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
11e00 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
11e10 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
11e20 20 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72       tempWC.wctr
11e30 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
11e40 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
11e50 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
11e60 20 20 73 42 4f 49 2e 70 57 43 20 3d 20 26 74 65    sBOI.pWC = &te
11e70 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
11e80 62 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29  bestIndex(&sBOI)
11e90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11ea0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
11eb0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
11ec0 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
11ed0 20 73 42 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sBOI.cost.rCost
11ee0 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
11ef0 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e  = sBOI.cost.plan
11f00 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75  .nRow;.        u
11f10 73 65 64 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74  sed |= sBOI.cost
11f20 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  .used;.        i
11f30 66 28 20 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f  f( rTotal>=p->co
11f40 73 74 2e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  st.rCost ) break
11f50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11f60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11f70 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11f80 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
11f90 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
11fa0 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
11fb0 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
11fc0 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
11fd0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
11fe0 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
11ff0 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
12000 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72  ... sorting incr
12010 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e  eases OR cost %.
12020 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20  9g to %.9g\n",. 
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61     rTotal, rTota
12050 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  l+nRow*estLog(nR
12060 6f 77 29 29 29 3b 2a 2f 0a 20 20 20 20 20 20 20  ow)));*/.       
12070 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a   rTotal += nRow*
12080 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
12090 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
120a0 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  If the cost of s
120b0 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68  canning using th
120c0 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f  is OR term for o
120d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20  ptimization is. 
120e0 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
120f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  n the current co
12100 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f  st stored in pCo
12110 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20  st, replace the 
12120 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a  contents.      *
12130 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20  * of pCost. */. 
12140 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43       /*WHERETRAC
12150 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e  E(("... multi-in
12160 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67  dex OR cost=%.9g
12170 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72   nrow=%.9g\n", r
12180 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 2a 2f  Total, nRow));*/
12190 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61  .      if( rTota
121a0 6c 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20  l<p->cost.rCost 
121b0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  ){.        p->co
121c0 73 74 2e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  st.rCost = rTota
121d0 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  l;.        p->co
121e0 73 74 2e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a  st.used = used;.
121f0 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
12200 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77  plan.nRow = nRow
12210 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  ;.        p->cos
12220 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20  t.plan.nOBSat = 
12230 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65 6c  p->i ? p->aLevel
12240 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
12250 42 53 61 74 20 3a 20 30 3b 0a 20 20 20 20 20 20  BSat : 0;.      
12260 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77    p->cost.plan.w
12270 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
12280 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 20  ULTI_OR;.       
12290 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
122a0 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20  pTerm = pTerm;. 
122b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
122c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
122d0 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
122e0 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66  ZATION */.}..#if
122f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12300 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
12310 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
12320 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20  UE if the WHERE 
12330 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72  clause term pTer
12340 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77  m is of a form w
12350 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64  here it.** could
12360 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
12370 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73   index to access
12380 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20   pSrc, assuming 
12390 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  an appropriate.*
123a0 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e  * index existed.
123b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
123c0 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
123d0 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  (.  WhereTerm *p
123e0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
123f0 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
12400 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b  se term to check
12410 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
12420 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
12430 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65       /* Table we
12440 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61   are trying to a
12450 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61  ccess */.  Bitma
12460 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
12470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
12480 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  les in outer loo
12490 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ps of the join *
124a0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  /.){.  char aff;
124b0 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65  .  if( pTerm->le
124c0 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e  ftCursor!=pSrc->
124d0 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
124e0 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
124f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
12500 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  _EQ)==0 ) return
12510 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
12520 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
12530 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
12540 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
12550 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
12560 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
12570 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
12580 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
12590 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
125a0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
125b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
125c0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
125d0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
125e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
125f0 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66  C_INDEX./*.** If
12600 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
12610 66 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69  for pSrc specifi
12620 65 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61  ed in pCost is a
12630 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
12640 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67  .** and indexing
12650 20 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74   is allows (if t
12660 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49  here is no NOT I
12670 4e 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61  NDEXED clause) a
12680 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c  nd it.** possibl
12690 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  e to construct a
126a0 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
126b0 20 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66   that would perf
126c0 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68  orm better.** th
126d0 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
126e0 73 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74  scan even when t
126f0 68 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74  he cost of const
12700 72 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65  ructing the inde
12710 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e  x.** is taken in
12720 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e  to account, then
12730 20 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79   alter the query
12740 20 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65   plan to use the
12750 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  .** transient in
12760 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
12770 6f 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69  oid bestAutomati
12780 63 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74  cIndex(WhereBest
12790 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  Idx *p){.  Parse
127a0 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
127b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
127c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
127d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
127e0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
127f0 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20  p->pWC;         
12800 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
12810 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
12820 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12830 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
12840 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
12850 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
12860 72 63 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  rch */.  double 
12870 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20  nTableRow;      
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12890 2a 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * Rows in the in
128a0 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64  put table */.  d
128b0 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20  ouble logN;     
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62       /* log(nTab
128e0 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62  leRow) */.  doub
128f0 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20  le costTempIdx; 
12900 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71          /* per-q
12910 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65  uery cost of the
12920 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
12930 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12940 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
12950 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
12960 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
12970 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
12980 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
12990 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
129a0 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
129b0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
129c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
129d0 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62  able tht might b
129e0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  e indexed */..  
129f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  if( pParse->nQue
12a00 72 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29  ryLoop<=(double)
12a10 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  1 ){.    /* Ther
12a20 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
12a30 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
12a40 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72  omatic index for
12a50 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a   a single scan *
12a60 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
12a70 7d 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  }.  if( (pParse-
12a80 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
12a90 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d  ITE_AutoIndex)==
12aa0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f  0 ){.    /* Auto
12ab0 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72  matic indices ar
12ac0 65 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75  e disabled at ru
12ad0 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65  n-time */.    re
12ae0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
12af0 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  (p->cost.plan.ws
12b00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
12b10 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 0a 20  T_FULLSCAN)!=0. 
12b20 20 20 26 26 20 28 70 2d 3e 63 6f 73 74 2e 70 6c    && (p->cost.pl
12b30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
12b40 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d  RE_COVER_SCAN)==
12b50 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  0.  ){.    /* We
12b60 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73 6f   already have so
12b70 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78  me kind of index
12b80 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73   in use for this
12b90 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72   query. */.    r
12ba0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
12bb0 20 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74   pSrc->viaCorout
12bc0 69 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ine ){.    /* Ca
12bd0 6e 6e 6f 74 20 69 6e 64 65 78 20 61 20 63 6f 2d  nnot index a co-
12be0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 72  routine */.    r
12bf0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
12c00 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
12c10 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
12c20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
12c30 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  se appears in th
12c40 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65  e SQL. */.    re
12c50 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
12c60 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
12c70 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
12c80 20 73 6f 75 72 63 65 20 69 73 20 61 20 63 6f 72   source is a cor
12c90 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
12ca0 79 2e 20 4e 6f 20 70 6f 69 6e 74 20 69 6e 20 69  y. No point in i
12cb0 6e 64 65 78 69 6e 67 20 69 74 2e 20 2a 2f 0a 20  ndexing it. */. 
12cc0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
12cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12ce0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20  ->nQueryLoop >= 
12cf0 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20 70  (double)1 );.  p
12d00 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
12d10 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20  ab;.  nTableRow 
12d20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73  = pTable->nRowEs
12d30 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c  t;.  logN = estL
12d40 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20  og(nTableRow);. 
12d50 20 63 6f 73 74 54 65 6d 70 49 64 78 20 3d 20 32   costTempIdx = 2
12d60 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77  *logN*(nTableRow
12d70 2f 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  /pParse->nQueryL
12d80 6f 6f 70 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  oop + 1);.  if( 
12d90 63 6f 73 74 54 65 6d 70 49 64 78 3e 3d 70 2d 3e  costTempIdx>=p->
12da0 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20  cost.rCost ){.  
12db0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
12dc0 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 74 72   creating the tr
12dd0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 77 6f  ansient table wo
12de0 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20 74  uld be greater t
12df0 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  han.    ** doing
12e00 20 74 68 65 20 66 75 6c 6c 20 74 61 62 6c 65 20   the full table 
12e10 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  scan */.    retu
12e20 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rn;.  }..  /* Se
12e30 61 72 63 68 20 66 6f 72 20 61 6e 79 20 65 71 75  arch for any equ
12e40 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
12e50 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43 45 6e   term */.  pWCEn
12e60 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
12e70 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72 28 70  >nTerm];.  for(p
12e80 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
12e90 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
12ea0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
12eb0 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
12ec0 54 65 72 6d 2c 20 70 53 72 63 2c 20 70 2d 3e 6e  Term, pSrc, p->n
12ed0 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
12ee0 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28    /*WHERETRACE((
12ef0 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75  "auto-index redu
12f00 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e  ces cost from %.
12f10 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20  1f to %.1f\n",. 
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
12f40 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b  , costTempIdx));
12f50 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  */.      p->cost
12f60 2e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d  .rCost = costTem
12f70 70 49 64 78 3b 0a 20 20 20 20 20 20 70 2d 3e 63  pIdx;.      p->c
12f80 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  ost.plan.nRow = 
12f90 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20  logN + 1;.      
12fa0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
12fb0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d  lags = WHERE_TEM
12fc0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70  P_INDEX;.      p
12fd0 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 70 54  ->cost.used = pT
12fe0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
12ff0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13000 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
13010 0a 23 20 64 65 66 69 6e 65 20 62 65 73 74 41 75  .# define bestAu
13020 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 41 29 20  tomaticIndex(A) 
13030 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e   /* no-op */.#en
13040 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
13050 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
13060 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  EX */...#ifndef 
13070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13080 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
13090 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
130a0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
130b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
130c0 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
130d0 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
130e0 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
130f0 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
13100 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
13110 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
13120 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
13130 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
13140 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
13150 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
13160 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
13170 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13190 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
131a0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
131b0 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
131c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
131d0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
131e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
131f0 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
13200 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
13210 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
13220 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
13230 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
13240 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
13250 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
13260 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
13270 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
13280 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
13290 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
132a0 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
132b0 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  int nColumn;    
132c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
132d0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
132e0 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
132f0 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
13300 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
13310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
13320 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
13330 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13340 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
13350 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
13360 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
13370 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  a[] */.  int nBy
13380 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
13390 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
133a0 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f  memory needed fo
133b0 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  r pIdx */.  Inde
133c0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
133d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
133e0 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
133f0 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
13400 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
13430 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
13440 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13450 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
13460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13470 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
13480 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
13490 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
134a0 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
134b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
134c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
134d0 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  exed */.  KeyInf
134e0 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20  o *pKeyinfo;    
134f0 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
13500 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
13510 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20 69   index */   .  i
13520 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
13530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
13540 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
13550 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
13560 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
13570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
13580 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
13590 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
135a0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135c0 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
135d0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
13600 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
13610 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
13620 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
13630 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
13640 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
13650 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
13660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
13670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
13680 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
13690 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73   Bitmask idxCols
136a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
136b0 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e  Bitmap of column
136c0 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  s used for index
136d0 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
136e0 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20   extraCols;     
136f0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
13700 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
13710 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  umns */..  /* Ge
13720 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
13730 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
13740 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
13750 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
13760 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
13770 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
13780 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
13790 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
137a0 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
137b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
137c0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
137d0 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
137e0 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
137f0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
13800 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
13810 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
13820 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
13830 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
13840 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
13850 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
13860 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
13870 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
13880 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
13890 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
138a0 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
138b0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
138c0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
138d0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
138e0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
138f0 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13900 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13910 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13920 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13930 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13940 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13950 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13960 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
13970 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
13980 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
13990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
139a0 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
139b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
139c0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
139d0 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
139e0 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
139f0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b         nColumn++
13a00 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
13a10 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
13a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13a30 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
13a40 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  0 );.  pLevel->p
13a50 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d  lan.nEq = nColum
13a60 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  n;..  /* Count t
13a70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
13a80 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
13a90 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
13aa0 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
13ab0 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
13ac0 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
13ad0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
13ae0 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
13af0 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
13b00 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
13b10 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
13b20 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
13b30 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
13b40 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
13b50 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
13b60 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
13b70 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
13b80 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13b90 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
13ba0 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
13bb0 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
13bc0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
13bd0 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
13be0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
13bf0 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
13c00 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
13c10 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
13c20 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
13c30 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
13c40 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
13c50 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   | (((Bitmask)1)
13c60 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d  <<(BMS-1)));.  m
13c70 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c  xBitCol = (pTabl
13c80 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31  e->nCol >= BMS-1
13c90 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62  ) ? BMS-1 : pTab
13ca0 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74  le->nCol;.  test
13cb0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13cc0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
13cd0 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
13ce0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
13cf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
13d00 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
13d10 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
13d20 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
13d30 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a  i) ) nColumn++;.
13d40 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
13d50 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
13d60 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
13d70 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  ) ){.    nColumn
13d80 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
13d90 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
13da0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77    pLevel->plan.w
13db0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13dc0 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
13dd0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
13de0 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
13df0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
13e00 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
13e10 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d  dex */.  nByte =
13e20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a   sizeof(Index);.
13e30 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13e40 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20  mn*sizeof(int); 
13e50 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
13e60 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65  olumn */.  nByte
13e70 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
13e80 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20  of(char*);   /* 
13e90 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a  Index.azColl */.
13ea0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13eb0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
13ec0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
13ed0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64  rtOrder */.  pId
13ee0 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
13ef0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
13f00 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
13f10 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
13f20 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c  rn;.  pLevel->pl
13f30 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78  an.u.pIdx = pIdx
13f40 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
13f50 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
13f60 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
13f70 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
13f80 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
13f90 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
13fa0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
13fb0 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
13fc0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
13fd0 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
13fe0 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
13ff0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
14000 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
14010 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
14020 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
14030 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
14040 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
14050 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
14060 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
14070 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
14080 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
14090 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
140a0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
140b0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
140c0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
140d0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
140e0 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
140f0 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
14100 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  <<iCol;.      if
14110 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
14120 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
14130 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
14140 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
14150 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
14160 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
14170 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
14180 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
14190 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
141a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
141b0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
141c0 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
141d0 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
141e0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
141f0 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
14200 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
14210 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
14220 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
14230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14240 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
14250 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c  32)n==pLevel->pl
14260 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  an.nEq );..  /* 
14270 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
14280 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
14290 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
142a0 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
142b0 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
142c0 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
142d0 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
142e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
142f0 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d  raCols & (((Bitm
14300 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20  ask)1)<<i) ){.  
14310 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
14320 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
14330 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
14340 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
14350 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
14360 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
14370 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61  lUsed & (((Bitma
14380 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
14390 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
143a0 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
143b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
143c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
143d0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
143e0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
143f0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
14400 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
14410 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75  assert( n==nColu
14420 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  mn );..  /* Crea
14430 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
14440 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79   index */.  pKey
14450 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  info = sqlite3In
14460 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
14470 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65  e, pIdx);.  asse
14480 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
14490 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Cur>=0 );.  sqli
144a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
144b0 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
144c0 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
144d0 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30  ur, nColumn+1, 0
144e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
144f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
14500 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yinfo, P4_KEYINF
14510 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64  O_HANDOFF);.  Vd
14520 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
14530 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
14540 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
14550 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
14560 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
14570 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
14580 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
14590 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
145a0 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
145b0 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
145c0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
145d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
145e0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
145f0 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
14600 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
14610 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
14620 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 1);.  sqlite3
14630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14640 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
14650 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
14660 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
14670 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
14680 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
14690 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
146a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
146b0 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d  OP_Next, pLevel-
146c0 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f  >iTabCur, addrTo
146d0 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  p+1);.  sqlite3V
146e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
146f0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
14700 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
14710 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14720 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
14730 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14740 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
14750 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20  regRecord);.  . 
14760 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
14770 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
14780 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
14790 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
147a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
147b0 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nit);.}.#endif /
147c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
147d0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
147e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
147f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14800 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
14810 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
14820 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
14830 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
14840 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
14850 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14860 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
14870 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
14880 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
14890 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
148a0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
148b0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
148c0 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
148d0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
148e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
148f0 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
14900 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
14910 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43  pParse,.  WhereC
14920 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74  lause *pWC,.  st
14930 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14940 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
14950 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
14960 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
14970 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
14980 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14990 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
149a0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
149b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
149c0 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
149d0 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
149e0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
149f0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
14a00 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
14a10 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
14a20 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
14a30 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
14a40 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 57 48  IdxInfo;..  /*WH
14a50 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
14a60 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
14a70 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
14a80 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
14a90 65 29 29 3b 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 75  e));*/..  /* Cou
14aa0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
14ab0 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
14ac0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
14ad0 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
14ae0 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
14af0 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
14b00 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
14b10 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
14b20 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
14b30 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
14b40 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
14b50 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
14b60 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14b70 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
14b80 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
14b90 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
14ba0 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
14bb0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
14bc0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
14bd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
14be0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14bf0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
14c00 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
14c10 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
14c20 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
14c30 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
14c40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14c50 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
14c60 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
14c70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14c80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14c90 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
14ca0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
14cb0 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
14cc0 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
14cd0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
14ce0 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
14cf0 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
14d00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14d10 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
14d20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
14d30 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
14d40 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
14d50 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14d60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14d70 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
14d80 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
14d90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14da0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
14db0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
14dc0 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
14dd0 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
14de0 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
14df0 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
14e00 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
14e10 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
14e20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
14e30 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14e40 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
14e50 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
14e60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
14e70 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
14e80 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
14e90 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
14eb0 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
14ec0 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
14ed0 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
14f00 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
14f10 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
14f20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
14f30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14f40 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
14f50 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
14f60 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
14f70 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
14f80 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
14f90 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65  INT... */.    re
14fa0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
14fb0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
14fc0 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
14fd0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14fe0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
14ff0 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
15000 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
15010 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
15020 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
15030 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
15040 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
15050 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
15060 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
15070 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
15080 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
15090 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
150a0 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
150b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
150c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
150d0 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
150e0 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
150f0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15100 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
15110 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
15120 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
15130 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15140 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
15150 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
15160 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
15170 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15180 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
15190 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
151a0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
151b0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
151c0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
151d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
151e0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
151f0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
15200 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
15210 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
15220 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
15230 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
15240 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
15250 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15260 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
15270 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
15280 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
15290 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
152e0 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
152f0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
15300 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
15310 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
15320 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
15330 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
15340 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
15350 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15360 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
15370 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
15380 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
15390 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
153a0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
153b0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
153c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
153d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
153e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
153f0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
15400 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
15410 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
15420 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
15430 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
15440 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
15450 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
15460 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
15470 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
15480 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15490 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
154a0 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
154b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
154c0 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
154d0 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
154e0 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
154f0 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
15500 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
15510 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
15520 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
15530 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
15540 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
15550 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
15560 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15570 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
15580 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
15590 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
155a0 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
155b0 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
155c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
155d0 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
155e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
155f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15600 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
15610 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
15620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15630 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
15640 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
15650 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15660 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
15670 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15680 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
15690 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
156a0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
156b0 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
156c0 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
156d0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
156e0 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
156f0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
15700 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
15710 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
15720 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
15730 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
15740 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
15750 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
15760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
15770 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15780 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15790 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
157a0 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
157b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
157c0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
157d0 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
157e0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
157f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15800 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
15810 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
15820 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
15830 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15840 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15850 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
15860 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
15870 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
15880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
15890 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
158a0 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
158b0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
158c0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
158d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
158e0 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 0a   pointer passed.
158f0 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ** as the argume
15900 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
15910 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50  error occurs, pP
15920 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65  arse is populate
15930 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
15940 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a  message and a.**
15950 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
15960 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
15970 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
15980 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75  urned and the ou
15990 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20  tput.** part of 
159a0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
159b0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
159c0 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74   is left populat
159d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  ed..**.** Whethe
159e0 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
159f0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
15a00 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
15a10 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
15a20 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
15a30 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
15a40 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
15a50 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
15a60 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
15a70 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
15a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
15a90 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
15aa0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
15ab0 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
15ac0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
15ad0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
15ae0 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
15af0 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
15b00 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
15b10 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
15b20 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 57 48 45 52  nt rc;..  /*WHER
15b30 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
15b40 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
15b50 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a  Tab->zName));*/.
15b60 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
15b70 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
15b80 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
15b90 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
15ba0 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
15bb0 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
15bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15bd0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
15be0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
15bf0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
15c00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
15c10 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
15c20 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
15c30 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
15c40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15c50 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
15c60 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
15c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
15c80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15c90 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
15ca0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
15cb0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
15cc0 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
15cd0 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
15ce0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
15cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
15d00 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
15d10 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
15d20 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
15d30 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
15d40 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
15d50 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
15d60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15d70 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
15d80 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
15d90 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
15da0 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
15db0 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
15dc0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
15dd0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
15de0 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nErr;.}.../*.** 
15df0 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
15e00 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
15e10 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
15e20 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
15e30 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
15e40 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
15e50 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
15e60 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
15e70 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
15e80 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
15e90 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
15ea0 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
15eb0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15ec0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
15ed0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
15ee0 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
15ef0 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
15f00 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
15f10 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
15f20 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
15f30 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
15f40 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
15f50 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
15f60 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15f70 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
15f80 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
15f90 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
15fa0 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
15fb0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
15fc0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
15fd0 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
15fe0 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
15ff0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
16000 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
16010 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
16020 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
16030 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
16040 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
16050 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
16060 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
16070 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
16080 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
16090 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
160a0 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
160b0 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
160c0 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
160d0 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75  c void bestVirtu
160e0 61 6c 49 6e 64 65 78 28 57 68 65 72 65 42 65 73  alIndex(WhereBes
160f0 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73  tIdx *p){.  Pars
16100 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
16110 50 61 72 73 65 3b 20 20 20 20 20 20 2f 2a 20 54  Parse;      /* T
16120 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
16130 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
16140 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
16150 43 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  C;      /* The W
16160 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
16170 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
16180 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e  item *pSrc = p->
16190 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f  pSrc; /* The FRO
161a0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
161b0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
161c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d  le *pTab = pSrc-
161d0 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
161e0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
161f0 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
16200 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
16210 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
16220 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
16230 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
16240 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
16250 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
16260 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
16270 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
16280 72 42 79 3b 0a 20 20 69 6e 74 20 62 41 6c 6c 6f  rBy;.  int bAllo
16290 77 49 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20  wIN;            
162a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20         /* Allow 
162b0 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IN optimizations
162c0 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f   */.  double rCo
162d0 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
162e0 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20 69  ure wsFlags is i
162f0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f  nitialized to so
16300 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f  me sane value. O
16310 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
16320 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e   .  ** malloc in
16330 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
16340 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20 74  fo() fails and t
16350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16360 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a  urns leaving.  *
16370 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e 20  * wsFlags in an 
16380 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
16390 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ate, the caller 
163a0 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72 65  may behave unpre
163b0 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20  dictably..  */. 
163c0 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73 74   memset(&p->cost
163d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  , 0, sizeof(p->c
163e0 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73 74  ost));.  p->cost
163f0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  .plan.wsFlags = 
16400 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
16410 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  LE;..  /* If the
16420 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
16430 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61  nfo structure ha
16440 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
16450 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ously.  ** alloc
16460 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
16470 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  ized, then alloc
16480 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
16490 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ze it now..  */.
164a0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 2d    pIdxInfo = *p-
164b0 3e 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66  >ppIdxInfo;.  if
164c0 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
164d0 0a 20 20 20 20 2a 70 2d 3e 70 70 49 64 78 49 6e  .    *p->ppIdxIn
164e0 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20  fo = pIdxInfo = 
164f0 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
16500 6f 28 70 50 61 72 73 65 2c 70 57 43 2c 70 53 72  o(pParse,pWC,pSr
16510 63 2c 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  c,p->pOrderBy);.
16520 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e    }.  if( pIdxIn
16530 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  fo==0 ){.    ret
16540 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  urn;.  }..  /* A
16550 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
16560 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
16570 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
16580 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69  hat pIdxInfo poi
16590 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c  nts.  ** to will
165a0 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69   have been initi
165b0 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64  alized, either d
165c0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
165d0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a  t invocation or.
165e0 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65    ** during some
165f0 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f   prior invocatio
16600 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20  n.  Now we just 
16610 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a  have to customiz
16620 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69  e the.  ** detai
16630 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66  ls of pIdxInfo f
16640 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  or the current i
16650 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  nvocation and pa
16660 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42  ss it to.  ** xB
16670 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a  estIndex..  */..
16680 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20    /* The module 
16690 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66  name must be def
166a0 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74  ined. Also, by t
166b0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
166c0 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70  must.  ** be a p
166d0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
166e0 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
166f0 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  ure. Otherwise. 
16700 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47   ** sqlite3ViewG
16710 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
16720 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65  would have picke
16730 64 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20  d up the error. 
16740 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16750 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
16760 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  g && pTab->azMod
16770 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61  uleArg[0] );.  a
16780 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 65  ssert( sqlite3Ge
16790 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
167a0 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20  db, pTab) );..  
167b0 2f 2a 20 54 72 79 20 6f 6e 63 65 20 6f 72 20 74  /* Try once or t
167c0 77 69 63 65 2e 20 20 4f 6e 20 74 68 65 20 66 69  wice.  On the fi
167d0 72 73 74 20 61 74 74 65 6d 70 74 2c 20 61 6c 6c  rst attempt, all
167e0 6f 77 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69  ow IN optimizati
167f0 6f 6e 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20  ons..  ** If an 
16800 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  IN optimization 
16810 69 73 20 61 63 63 65 70 74 65 64 20 62 79 20 74  is accepted by t
16820 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
16830 20 78 42 65 73 74 49 6e 64 65 78 0a 20 20 2a 2a   xBestIndex.  **
16840 20 6d 65 74 68 6f 64 2c 20 62 75 74 20 74 68 65   method, but the
16850 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72    pInfo->aConstr
16860 61 69 6e 55 73 61 67 65 2e 6f 6d 69 74 20 66 6c  ainUsage.omit fl
16870 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
16880 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 71 75 65  hen.  ** the que
16890 72 79 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ry will not work
168a0 20 62 65 63 61 75 73 65 20 69 74 20 6d 69 67 68   because it migh
168b0 74 20 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74  t allow duplicat
168c0 65 20 72 6f 77 73 20 69 6e 0a 20 20 2a 2a 20 6f  e rows in.  ** o
168d0 75 74 70 75 74 2e 20 20 49 6e 20 74 68 61 74 20  utput.  In that 
168e0 63 61 73 65 2c 20 72 75 6e 20 74 68 65 20 78 42  case, run the xB
168f0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
16900 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 0a 20 20  a second time.  
16910 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20 49  ** without the I
16920 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  N constraints.  
16930 55 73 75 61 6c 6c 79 20 74 68 69 73 20 6c 6f 6f  Usually this loo
16940 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
16950 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  ..  ** The loop 
16960 77 69 6c 6c 20 65 78 69 74 20 75 73 69 6e 67 20  will exit using 
16970 61 20 22 62 72 65 61 6b 22 20 73 74 61 74 65 6d  a "break" statem
16980 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ent..  */.  for(
16990 62 41 6c 6c 6f 77 49 4e 3d 31 3b 20 31 3b 20 62  bAllowIN=1; 1; b
169a0 41 6c 6c 6f 77 49 4e 2d 2d 29 7b 0a 20 20 20 20  AllowIN--){.    
169b0 61 73 73 65 72 74 28 20 62 41 6c 6c 6f 77 49 4e  assert( bAllowIN
169c0 3d 3d 30 20 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d  ==0 || bAllowIN=
169d0 3d 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  =1 );..    /* Se
169e0 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
169f0 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
16a00 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
16a10 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 6f 75 74   all .    ** out
16a20 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
16a30 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   zero..    **.  
16a40 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
16a50 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
16a60 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
16a70 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
16a80 74 2d 68 61 6e 64 0a 20 20 20 20 2a 2a 20 73 69  t-hand.    ** si
16a90 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
16aa0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
16ab0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
16ac0 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
16ad0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  .    ** table.  
16ae0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
16af0 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
16b00 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
16b10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
16b20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
16b30 20 3d 20 65 78 70 72 0a 20 20 20 20 2a 2a 0a 20   = expr.    **. 
16b40 20 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65     ** and we are
16b50 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f   evaluating a jo
16b60 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  in, then the con
16b70 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d  straint on colum
16b80 6e 20 69 73 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c  n is .    ** onl
16b90 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
16ba0 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
16bb0 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
16bc0 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 2a  o the left.    *
16bd0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
16be0 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
16bf0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16c00 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
16c10 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
16c20 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
16c30 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
16c40 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
16c50 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
16c60 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
16c70 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
16c80 6f 6e 63 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e  once.    ** even
16c90 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74   though we might
16ca0 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65   try to pick the
16cb0 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74   best index mult
16cc0 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 20 20  iple times..    
16cd0 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
16ce0 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
16cf0 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
16d00 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
16d10 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 20  the.    ** join 
16d20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65  might be differe
16d30 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  nt so we have to
16d40 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75   recompute the u
16d50 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a  sable flag.    *
16d60 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  * each time..   
16d70 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   */.    pIdxCons
16d80 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
16d90 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
16da0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
16db0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
16dc0 20 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78     pUsage = pIdx
16dd0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
16de0 74 55 73 61 67 65 3b 0a 20 20 20 20 66 6f 72 28  tUsage;.    for(
16df0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
16e00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
16e10 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
16e20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
16e30 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
16e40 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
16e50 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
16e60 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
16e70 72 65 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52  reqRight&p->notR
16e80 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
16e90 26 26 20 28 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20  && (bAllowIN || 
16ea0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
16eb0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20  r & WO_IN)==0). 
16ec0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16ed0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
16ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
16ef0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 43  e{.        pIdxC
16f00 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
16f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16f20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
16f30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
16f40 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
16f50 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
16f60 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
16f70 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
16f80 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
16f90 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
16fa0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  ->idxStr);.    }
16fb0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
16fc0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
16fd0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
16fe0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
16ff0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
17000 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
17010 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
17020 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
17030 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
17040 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
17050 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
17060 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70  OINT... */.    p
17070 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
17080 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
17090 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62  BIG_DBL / ((doub
170a0 6c 65 29 32 29 3b 0a 20 20 20 20 6e 4f 72 64 65  le)2);.    nOrde
170b0 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  rBy = pIdxInfo->
170c0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66  nOrderBy;.    if
170d0 28 20 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  ( !p->pOrderBy )
170e0 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
170f0 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->nOrderBy = 0;.
17100 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17110 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
17120 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
17130 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  xInfo) ){.      
17140 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
17150 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
17160 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
17170 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
17180 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
17190 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
171a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
171b0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
171c0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
171d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 55  +){.      if( pU
171e0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
171f0 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  x>0 ){.        j
17200 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
17210 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
17220 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
17230 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d  a[j];.        p-
17240 3e 63 6f 73 74 2e 75 73 65 64 20 7c 3d 20 70 54  >cost.used |= pT
17250 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
17260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
17270 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
17280 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
17290 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
172a0 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
172b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
172c0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
172d0 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
172e0 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
172f0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
17300 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
17310 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
17320 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
17330 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
17340 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
17350 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
17360 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
17370 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
17380 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
17390 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
173a0 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
173b0 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
173c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
173d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
173e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
173f0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
17400 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
17410 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
17420 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
17430 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
17440 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17450 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
17460 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
17470 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
17480 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
17490 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
174a0 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
174b0 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
174c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
174d0 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
174e0 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
174f0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
17500 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
17510 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
17520 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
17530 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
17540 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
17550 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17560 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
17570 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
17580 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
17590 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 72 64 65  }..  /* The orde
175a0 72 42 79 43 6f 6e 73 75 6d 65 64 20 73 69 67 6e  rByConsumed sign
175b0 61 6c 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  al is only valid
175c0 20 69 66 20 61 6c 6c 20 6f 75 74 65 72 20 6c 6f   if all outer lo
175d0 6f 70 73 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79  ops collectively
175e0 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 6a  .  ** generate j
175f0 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ust a single row
17600 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   of output..  */
17610 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
17620 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
17630 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
17640 20 69 3c 70 2d 3e 69 3b 20 69 2b 2b 29 7b 0a 20   i<p->i; i++){. 
17650 20 20 20 20 20 69 66 28 20 28 70 2d 3e 61 4c 65       if( (p->aLe
17660 76 65 6c 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c  vel[i].plan.wsFl
17670 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
17680 55 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  UE)==0 ){.      
17690 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
176a0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
176b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
176c0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68   }.  .  /* If th
176d0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
176e0 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
176f0 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74  he selected virt
17700 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a  ual table index.
17710 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61    ** does not sa
17720 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61  tisfy it, increa
17730 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  se the cost of t
17740 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e  he scan accordin
17750 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d  gly. This.  ** m
17760 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65  atches the proce
17770 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69  ssing for non-vi
17780 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20  rtual tables in 
17790 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
177a0 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d  ..  */.  rCost =
177b0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
177c0 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20  atedCost;.  if( 
177d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
177e0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
177f0 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20  Consumed==0 ){. 
17800 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c     rCost += estL
17810 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b  og(rCost)*rCost;
17820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
17830 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ost is not allow
17840 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ed to be larger 
17850 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f  than SQLITE_BIG_
17860 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e  DBL (the.  ** in
17870 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
17880 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
17890 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
178a0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28   then the.  ** (
178b0 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29  cost<lowestCost)
178c0 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c   test below will
178d0 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a   never be true..
178e0 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22    ** .  ** Use "
178f0 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65  (double)2" inste
17900 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63  ad of "2.0" in c
17910 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ase OMIT_FLOATIN
17920 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73  G_POINT .  ** is
17930 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20   defined..  */. 
17940 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47   if( (SQLITE_BIG
17950 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29  _DBL/((double)2)
17960 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70  )<rCost ){.    p
17970 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28  ->cost.rCost = (
17980 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28  SQLITE_BIG_DBL/(
17990 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d  (double)2));.  }
179a0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  else{.    p->cos
179b0 74 2e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  t.rCost = rCost;
179c0 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70  .  }.  p->cost.p
179d0 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d  lan.u.pVtabIdx =
179e0 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28   pIdxInfo;.  if(
179f0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
17a00 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
17a10 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77    p->cost.plan.w
17a20 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
17a30 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 70 2d 3e  ORDERED;.    p->
17a40 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  cost.plan.nOBSat
17a50 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = nOrderBy;.  }
17a60 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  else{.    p->cos
17a70 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20  t.plan.nOBSat = 
17a80 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65 6c  p->i ? p->aLevel
17a90 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
17aa0 42 53 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20 20  BSat : 0;.  }.  
17ab0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71  p->cost.plan.nEq
17ac0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
17ad0 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
17ae0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79  derBy;..  /* Try
17af0 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20   to find a more 
17b00 65 66 66 69 63 69 65 6e 74 20 61 63 63 65 73 73  efficient access
17b10 20 70 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e   pattern by usin
17b20 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78  g multiple index
17b30 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d  es.  ** to optim
17b40 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73  ize an OR expres
17b50 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20  sion within the 
17b60 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20  WHERE clause. . 
17b70 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75   */.  bestOrClau
17b80 73 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23 65  seIndex(p);.}.#e
17b90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17ba0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17bb0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
17bc0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
17bd0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
17be0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
17bf0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
17c00 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
17c10 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
17c20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
17c30 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
17c40 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
17c50 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
17c60 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
17c70 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
17c80 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
17c90 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
17ca0 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
17cb0 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
17cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
17cd0 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
17ce0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
17cf0 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
17d00 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
17d10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17d30 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d50 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
17d60 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
17d70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17d80 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
17d90 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
17da0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
17db0 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
17dc0 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
17dd0 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
17de0 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
17df0 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e10 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
17e20 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
17e30 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e   tRowcnt n;.  In
17e40 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
17e50 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79  le;.  int i, eTy
17e60 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d  pe;.  int isEq =
17e70 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64   0;.  i64 v;.  d
17e80 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20  ouble r, rS;..  
17e90 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
17ea0 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
17eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
17ec0 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
17ed0 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29  .  if( pVal==0 )
17ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17ef0 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78  RROR;.  n = pIdx
17f00 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
17f10 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   aSample = pIdx-
17f20 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70  >aSample;.  eTyp
17f30 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
17f40 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20  e_type(pVal);.. 
17f50 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
17f60 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
17f70 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    v = sqlite3_va
17f80 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b  lue_int64(pVal);
17f90 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b  .    r = (i64)v;
17fa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17fb0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
17fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
17fd0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
17fe0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
17ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
18000 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
18010 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype>=SQLITE_TEXT
18020 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18030 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
18040 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
18050 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
18060 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
18070 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20  .i>=v ){.       
18080 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
18090 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20  e[i].u.i==v;.   
180a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
180b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
180c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
180d0 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ert( aSample[i].
180e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
180f0 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  OAT );.        i
18100 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
18110 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=r ){.        
18120 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
18130 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20  [i].u.r==r;.    
18140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18160 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
18170 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
18180 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOAT ){.    r = 
18190 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
181a0 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  uble(pVal);.    
181b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
181c0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
181d0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
181e0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
181f0 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
18200 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
18210 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
18220 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
18230 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
18240 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
18250 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
18260 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
18270 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20  ample[i].u.r;.  
18280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18290 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
182a0 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  i].u.i;.      }.
182b0 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20        if( rS>=r 
182c0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  ){.        isEq 
182d0 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20  = rS==r;.       
182e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
182f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18300 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
18310 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20  NULL ){.    i = 
18320 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70  0;.    if( aSamp
18330 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[0].eType==SQL
18340 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20  ITE_NULL ) isEq 
18350 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
18360 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
18370 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
18380 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
18390 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OB );.    for(i=
183a0 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
183b0 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
183c0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
183d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
183e0 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
183f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
18400 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  OB ){.        br
18410 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18420 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
18430 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20  x->nSample ){   
18440 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
18450 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
18460 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
18470 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
18480 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
18490 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
184a0 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
184b0 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
184c0 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
184d0 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
184e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
184f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
18500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
18510 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  oll->enc==SQLITE
18520 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d  _UTF8 );.      }
18530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
18540 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
18550 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
18560 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
18570 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
18580 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
18590 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
185a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
185b0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
185c0 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
185d0 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
185e0 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
185f0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
18600 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20       if( !z ){. 
18610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18640 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f  assert( z && pCo
18650 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
18660 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p );.      }.   
18670 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61     n = sqlite3Va
18680 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70  lueBytes(pVal, p
18690 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20  Coll->enc);.  . 
186a0 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64       for(; i<pId
186b0 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
186c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
186d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61  .        int eSa
186e0 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70  mpletype = aSamp
186f0 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20  le[i].eType;.   
18700 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
18710 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e  type<eType ) con
18720 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
18730 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d  f( eSampletype!=
18740 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23  eType ) break;.#
18750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18760 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20  IT_UTF16.       
18770 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21   if( pColl->enc!
18780 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
18790 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
187a0 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  ample;.         
187b0 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d   char *zSample =
187c0 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36   sqlite3Utf8to16
187d0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
187e0 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20  db, pColl->enc, 
187f0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20  aSample[i].u.z, 
18800 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
18810 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20  , &nSample.     
18820 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
18830 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29    if( !zSample )
18840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
18850 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18860 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
18870 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18880 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
18890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
188a0 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70   c = pColl->xCmp
188b0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
188c0 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c  Sample, zSample,
188d0 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   n, z);.        
188e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
188f0 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20  db, zSample);.  
18900 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
18910 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
18920 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
18930 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
18940 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ser, aSample[i].
18950 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69  nByte, aSample[i
18960 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ].u.z, n, z);.  
18970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18980 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20  if( c>=0 ){.    
18990 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
189a0 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20   isEq = 1;.     
189b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
189c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
189d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
189e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
189f0 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
18a00 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
18a10 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
18a20 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
18a30 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
18a40 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
18a50 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
18a60 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
18a70 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
18a80 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
18a90 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20   then isEq==1.. 
18aa0 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29   */.  if( isEq )
18ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
18ac0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
18ad0 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
18ae0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
18af0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
18b00 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20  Sample[i].nEq;. 
18b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
18b20 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
18b30 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
18b40 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
18b50 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
18b60 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
18b70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d  le[0].nLt;.    }
18b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
18b90 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53  er = i>=pIdx->nS
18ba0 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d  ample ? n : aSam
18bb0 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
18bc0 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
18bd0 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53  le[i-1].nEq + aS
18be0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a  ample[i-1].nLt;.
18bf0 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
18c00 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71  1] = pIdx->avgEq
18c10 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
18c20 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
18c30 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
18c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
18c50 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
18c60 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
18c70 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
18c80 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
18c90 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
18ca0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
18cb0 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
18cc0 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
18cd0 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20  er + iGap;.  }. 
18ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18cf0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
18d00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18d10 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  T3 */../*.** If 
18d20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
18d30 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69   represents a li
18d40 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74  teral value, set
18d50 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
18d60 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  .** an sqlite3_v
18d70 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
18d80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61  ontaining the sa
18d90 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61  me value, with a
18da0 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61  ffinity.** aff a
18db0 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65  pplied to it, be
18dc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
18dd0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
18de0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
18df0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
18e00 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
18e10 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
18e20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f  by passing it to
18e30 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75   .** sqlite3Valu
18e40 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eFree()..**.** I
18e50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  f the current pa
18e60 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69  rse is a recompi
18e70 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65  le (sqlite3Repre
18e80 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70  pare()) and pExp
18e90 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76  r.** is an SQL v
18ea0 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72  ariable that cur
18eb0 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e  rently has a non
18ec0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e  -NULL value boun
18ed0 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61  d to it,.** crea
18ee0 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  te an sqlite3_va
18ef0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
18f00 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61  ntaining this va
18f10 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a  lue, again with.
18f20 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ** affinity aff 
18f30 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69  applied to it, i
18f40 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
18f50 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20   neither of the 
18f60 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74  above apply, set
18f70 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   *pp to NULL..**
18f80 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
18f90 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
18fa0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
18fb0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
18fc0 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  OK..*/.#ifdef SQ
18fd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18fe0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c  3.static int val
18ff0 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61  ueFromExpr(.  Pa
19000 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
19010 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
19020 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74  u8 aff, .  sqlit
19030 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b  e3_value **pp.){
19040 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
19050 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20  ==TK_VARIABLE.  
19060 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
19070 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
19080 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41  Expr->op2==TK_VA
19090 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20  RIABLE).  ){.   
190a0 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70   int iVar = pExp
190b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
190c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
190d0 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
190e0 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
190f0 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *pp = sqlite3Vdb
19100 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eGetValue(pParse
19110 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
19120 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65  ar, aff);.    re
19130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19140 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
19150 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
19160 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
19170 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
19180 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65  , aff, pp);.}.#e
19190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
191a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
191b0 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
191c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
191d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
191e0 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
191f0 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
19200 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
19210 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
19220 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
19230 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
19240 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
19250 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
19260 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
19270 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
19280 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
19290 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
192a0 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
192b0 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
192c0 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
192d0 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
192e0 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
192f0 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
19300 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
19310 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
19320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
19330 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
19340 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
19370 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
19380 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
19390 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
193a0 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
193b0 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
193c0 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
193d0 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
193e0 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
193f0 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
19400 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
19410 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
19420 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73  nEq parameter is
19430 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65   passed the inde
19440 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  x of the index c
19450 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
19460 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f   the.** range co
19470 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
19480 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
19490 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
194a0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ty constraints.*
194b0 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  * optimized by t
194c0 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
194d0 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
194e0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e  ple, assuming in
194f0 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74  dex p is.** on t
19500 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
19510 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
19520 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
19530 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
19540 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
19550 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
19560 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
19570 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
19580 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
19590 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
195a0 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65  mn,.** b, is the
195b0 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73   second left-mos
195c0 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
195d0 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
195e0 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
195f0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
19600 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
19610 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
19620 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
19630 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a   be passed 0..**
19640 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
19650 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74   value is an int
19660 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20  eger divisor to 
19670 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
19680 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73  ated.** search s
19690 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20  pace.  A return 
196a0 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73  value of 1 means
196b0 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73   that range cons
196c0 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e  traints are.** n
196d0 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20  o help at all.  
196e0 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  A return value o
196f0 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20  f 2 means range 
19700 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
19710 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 72  ** expected to r
19720 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
19730 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20   space by half. 
19740 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e   And so forth...
19750 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
19760 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
19770 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61  stat3 ANALYZE da
19780 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69  ta, each range i
19790 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64  nequality.** red
197a0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
197b0 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
197c0 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61  r of 4.  Hence a
197d0 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
197e0 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75  nt (x>?).** resu
197f0 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20  lts in a return 
19800 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65  of 4 and a range
19810 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f   constraint (x>?
19820 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74   AND x<?) result
19830 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e  s.** in a return
19840 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69   of 16..*/.stati
19850 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
19860 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
19870 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19880 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
19890 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
198a0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
198b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
198c0 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74  * The index cont
198d0 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65  aining the range
198e0 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
198f0 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e  ; "x" */.  int n
19900 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
19910 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d  /* index into p-
19920 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72  >aCol[] of the r
19930 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
19940 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  lumn */.  WhereT
19950 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
19960 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
19970 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
19980 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
19990 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
199a0 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
199b0 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
199c0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
199d0 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
199e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62  e NULL */.  doub
199f0 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20 20 20  le *pRangeDiv   
19a00 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73  /* OUT: Reduce s
19a10 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 74  earch space by t
19a20 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29  his divisor */.)
19a30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19a40 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
19a50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19a60 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  AT3..  if( nEq==
19a70 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20  0 && p->nSample 
19a80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
19a90 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b  alue *pRangeVal;
19aa0 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  .    tRowcnt iLo
19ab0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f  wer = 0;.    tRo
19ac0 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d  wcnt iUpper = p-
19ad0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
19ae0 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
19af0 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e      u8 aff = p->
19b00 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
19b10 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66  aiColumn[0]].aff
19b20 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20  inity;..    if( 
19b30 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
19b40 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
19b50 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
19b60 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
19b70 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
19b80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
19b90 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  , &pRangeVal);. 
19ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
19bb0 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
19bc0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
19bd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
19be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
19bf0 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65        && whereKe
19c00 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
19c10 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20  , pRangeVal, 0, 
19c20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  a)==SQLITE_OK.  
19c30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
19c40 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
19c50 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65        if( (pLowe
19c60 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
19c70 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65  O_GT)!=0 ) iLowe
19c80 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
19c90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19ca0 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
19cb0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
19cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19cd0 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
19ce0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
19cf0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
19d00 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
19d10 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
19d20 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
19d30 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
19d40 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
19d50 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
19d60 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
19d70 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
19d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19d90 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
19da0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
19db0 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
19dc0 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 1, a)==SQLITE_
19dd0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
19de0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
19df0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ];.        if( (
19e00 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
19e10 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20  r & WO_LE)!=0 ) 
19e20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a  iUpper += a[1];.
19e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19e40 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
19e50 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d  RangeVal);.    }
19e60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19e80 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77  if( iUpper<=iLow
19e90 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
19ea0 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62  RangeDiv = (doub
19eb0 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30  le)p->aiRowEst[0
19ec0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
19ed0 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44          *pRangeD
19ee0 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e  iv = (double)p->
19ef0 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75  aiRowEst[0]/(dou
19f00 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20 69 4c  ble)(iUpper - iL
19f10 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ower);.      }. 
19f20 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43       /*WHERETRAC
19f30 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72  E(("range scan r
19f40 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
19f50 64 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20  div=%g\n",.     
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
19f70 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
19f80 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69  Upper, *pRangeDi
19f90 76 29 29 3b 2a 2f 0a 20 20 20 20 20 20 72 65 74  v));*/.      ret
19fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19fb0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
19fc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19fd0 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
19fe0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
19ff0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a000 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69  ETER(nEq);.#endi
1a010 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
1a020 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
1a030 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
1a040 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20  double)1;.  if( 
1a050 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
1a060 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
1a070 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70  M_VNULL)==0 ) *p
1a080 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75  RangeDiv *= (dou
1a090 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70 55 70  ble)4;.  if( pUp
1a0a0 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44 69 76  per ) *pRangeDiv
1a0b0 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20   *= (double)4;. 
1a0c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a0d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a0e0 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
1a0f0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
1a100 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1a110 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1a120 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
1a130 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1a140 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
1a150 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
1a160 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
1a170 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
1a180 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
1a190 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
1a1a0 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
1a1b0 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
1a1c0 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
1a1d0 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
1a1e0 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
1a1f0 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
1a200 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
1a210 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
1a220 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1a230 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
1a240 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
1a250 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
1a260 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
1a270 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
1a280 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
1a290 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
1a2a0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
1a2b0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
1a2c0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
1a2d0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
1a2e0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
1a2f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a300 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
1a310 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
1a320 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
1a330 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
1a340 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
1a350 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
1a360 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
1a370 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
1a380 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
1a390 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
1a3a0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
1a3b0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
1a3c0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
1a3d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1a3e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
1a3f0 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
1a400 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a410 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
1a420 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1a430 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1a440 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1a450 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1a460 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
1a470 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
1a480 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1a490 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
1a4a0 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
1a4b0 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
1a4c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1a4d0 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20   double *pnRow  
1a4e0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1a4f0 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
1a500 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
1a510 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
1a520 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f  ue *pRhs = 0;  /
1a530 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74  * VALUE on right
1a540 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54  -hand side of pT
1a550 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  erm */.  u8 aff;
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
1a580 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
1a590 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a5a0 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
1a5b0 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
1a5c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
1a5d0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
1a5e0 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
1a5f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
1a600 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
1a610 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
1a620 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d  >0 );.  aff = p-
1a630 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
1a640 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
1a650 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45  finity;.  if( pE
1a660 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  xpr ){.    rc = 
1a670 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
1a680 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
1a690 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66  , &pRhs);.    if
1a6a0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
1a6b0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
1a6c0 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ncel;.  }else{. 
1a6d0 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
1a6e0 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65  3ValueNew(pParse
1a6f0 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->db);.  }.  if(
1a700 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72   pRhs==0 ) retur
1a710 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
1a720 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b  D;.  rc = whereK
1a730 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
1a740 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a  p, pRhs, 0, a);.
1a750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a760 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 57 48 45  _OK ){.    /*WHE
1a770 52 45 54 52 41 43 45 28 28 22 65 71 75 61 6c 69  RETRACE(("equali
1a780 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
1a790 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
1a7a0 5d 29 29 3b 2a 2f 0a 20 20 20 20 2a 70 6e 52 6f  ]));*/.    *pnRo
1a7b0 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68  w = a[1];.  }.wh
1a7c0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
1a7d0 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65  cancel:.  sqlite
1a7e0 33 56 61 6c 75 65 46 72 65 65 28 70 52 68 73 29  3ValueFree(pRhs)
1a7f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a800 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1a810 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1a820 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64  _STAT3) */..#ifd
1a830 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a840 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
1a850 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1a860 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
1a870 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
1a880 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
1a890 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
1a8a0 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
1a8b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
1a8c0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
1a8d0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
1a8e0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
1a8f0 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
1a900 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
1a910 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
1a920 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
1a930 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
1a940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a950 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
1a960 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
1a970 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
1a980 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
1a990 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
1a9a0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
1a9b0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
1a9c0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
1a9d0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
1a9e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
1a9f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
1aa00 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
1aa10 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
1aa20 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1aa30 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
1aa40 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
1aa50 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
1aa60 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
1aa70 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
1aa80 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1aa90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1aaa0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
1aab0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1aac0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1aad0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
1aae0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1aaf0 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
1ab00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ab10 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
1ab20 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
1ab30 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  erm */.  ExprLis
1ab40 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1ab50 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
1ab60 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
1ab70 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
1ab80 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  .)" */.  double 
1ab90 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a  *pnRow        /*
1aba0 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
1abb0 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
1abc0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1abd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1abe0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
1abf0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
1ac00 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ode */.  double 
1ac10 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
1ac20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ac30 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
1ac40 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f  gle term */.  do
1ac50 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28  uble nRowEst = (
1ac60 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77  double)0; /* New
1ac70 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1ac80 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1ac90 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1acc0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1acd0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
1ace0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1acf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
1ad00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ad10 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
1ad20 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
1ad30 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
1ad40 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1ad50 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  p, pList->a[i].p
1ad60 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
1ad70 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
1ad80 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
1ad90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ada0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
1adb0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
1adc0 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
1add0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
1ade0 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
1adf0 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43  .    /*WHERETRAC
1ae00 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  E(("IN row estim
1ae10 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
1ae20 6e 52 6f 77 45 73 74 29 29 3b 2a 2f 0a 20 20 7d  nRowEst));*/.  }
1ae30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ae40 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1ae50 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1ae60 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  STAT3) */../*.**
1ae70 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ae80 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20   column iCol of 
1ae90 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
1aea0 75 72 73 6f 72 20 69 54 61 62 20 77 69 6c 6c 20  ursor iTab will 
1aeb0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 73 6f 72  appear.** in sor
1aec0 74 65 64 20 6f 72 64 65 72 20 61 63 63 6f 72 64  ted order accord
1aed0 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
1aee0 6e 74 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  nt query plan..*
1aef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  *.** Return valu
1af00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 20 20  es:.**.**    0  
1af10 20 69 43 6f 6c 20 69 73 20 6e 6f 74 20 6f 72 64   iCol is not ord
1af20 65 72 65 64 0a 2a 2a 20 20 20 20 31 20 20 20 69  ered.**    1   i
1af30 43 6f 6c 20 68 61 73 20 6f 6e 6c 79 20 61 20 73  Col has only a s
1af40 69 6e 67 6c 65 20 76 61 6c 75 65 0a 2a 2a 20 20  ingle value.**  
1af50 20 20 32 20 20 20 69 43 6f 6c 20 69 73 20 69 6e    2   iCol is in
1af60 20 41 53 43 20 6f 72 64 65 72 0a 2a 2a 20 20 20   ASC order.**   
1af70 20 33 20 20 20 69 43 6f 6c 20 69 73 20 69 6e 20   3   iCol is in 
1af80 44 45 53 43 20 6f 72 64 65 72 0a 2a 2f 0a 73 74  DESC order.*/.st
1af90 61 74 69 63 20 69 6e 74 20 69 73 4f 72 64 65 72  atic int isOrder
1afa0 65 64 43 6f 6c 75 6d 6e 28 0a 20 20 57 68 65 72  edColumn(.  Wher
1afb0 65 42 65 73 74 49 64 78 20 2a 70 2c 0a 20 20 69  eBestIdx *p,.  i
1afc0 6e 74 20 69 54 61 62 2c 0a 20 20 69 6e 74 20 69  nt iTab,.  int i
1afd0 43 6f 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Col.){.  int i, 
1afe0 6a 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  j;.  WhereLevel 
1aff0 2a 70 4c 65 76 65 6c 20 3d 20 26 70 2d 3e 61 4c  *pLevel = &p->aL
1b000 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 3b 0a 20 20  evel[p->i-1];.  
1b010 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 75  Index *pIdx;.  u
1b020 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 66  8 sortOrder;.  f
1b030 6f 72 28 69 3d 70 2d 3e 69 2d 31 3b 20 69 3e 3d  or(i=p->i-1; i>=
1b040 30 3b 20 69 2d 2d 2c 20 70 4c 65 76 65 6c 2d 2d  0; i--, pLevel--
1b050 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  ){.    if( pLeve
1b060 6c 2d 3e 69 54 61 62 43 75 72 21 3d 69 54 61 62  l->iTabCur!=iTab
1b070 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b080 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1b090 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1b0a0 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d  RE_ALL_UNIQUE)!=
1b0b0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1b0c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  n 1;.    }.    a
1b0d0 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e  ssert( (pLevel->
1b0e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1b0f0 48 45 52 45 5f 4f 52 44 45 52 45 44 29 21 3d 30  HERE_ORDERED)!=0
1b100 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 64   );.    if( (pId
1b110 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1b120 2e 75 2e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20  .u.pIdx)!=0 ){. 
1b130 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
1b140 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  ){.        sortO
1b150 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
1b160 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c 65    testcase( (pLe
1b170 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1b180 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
1b190 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  E)!=0 );.      }
1b1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1b1b0 74 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  t n = pIdx->nCol
1b1c0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  umn;.        for
1b1d0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=0; j<n; j++){
1b1e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1b1f0 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
1b200 75 6d 6e 5b 6a 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[j] ) break;.
1b210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b220 20 20 69 66 28 20 6a 3e 3d 6e 20 29 20 72 65 74    if( j>=n ) ret
1b230 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73  urn 0;.        s
1b240 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d  ortOrder = pIdx-
1b250 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1b260 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b270 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
1b280 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b290 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20  REVERSE)!=0 );. 
1b2a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1b2b0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
1b2c0 21 3d 28 2d 31 29 20 29 20 72 65 74 75 72 6e 20  !=(-1) ) return 
1b2d0 30 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64  0;.      sortOrd
1b2e0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 65  er = 0;.      te
1b2f0 73 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d  stcase( (pLevel-
1b300 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1b310 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
1b320 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 );.    }.    i
1b330 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
1b340 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1b350 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 7b 0a  _REVERSE)!=0 ){.
1b360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 6f        assert( so
1b370 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 73 6f  rtOrder==0 || so
1b380 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
1b390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 6f      testcase( so
1b3a0 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
1b3b0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
1b3c0 31 20 2d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  1 - sortOrder;. 
1b3d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1b3e0 73 6f 72 74 4f 72 64 65 72 2b 32 3b 0a 20 20 7d  sortOrder+2;.  }
1b3f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1b400 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b410 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
1b420 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
1b430 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
1b440 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
1b450 2c 20 65 69 74 68 65 72 20 69 6e 20 77 68 6f 6c  , either in whol
1b460 65 20 6f 72 20 69 6e 20 70 61 72 74 2e 20 20 54  e or in part.  T
1b470 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1b480 69 73 20 74 68 65 20 0a 2a 2a 20 63 75 6d 75 6c  is the .** cumul
1b490 61 74 69 76 65 20 6e 75 6d 62 65 72 20 6f 66 20  ative number of 
1b4a0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
1b4b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68 61  ER BY clause tha
1b4c0 74 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  t are satisfied.
1b4d0 2a 2a 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  ** by the index 
1b4e0 70 49 64 78 20 61 6e 64 20 6f 74 68 65 72 20 69  pIdx and other i
1b4f0 6e 64 69 63 65 73 20 69 6e 20 6f 75 74 65 72 20  ndices in outer 
1b500 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loops..**.** The
1b510 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
1b520 72 69 65 64 20 68 61 73 20 61 20 63 75 72 73 6f  ried has a curso
1b530 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73  r number of "bas
1b540 65 22 2e 20 20 70 49 64 78 20 69 73 20 74 68 65  e".  pIdx is the
1b550 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 74 20 69  .** index that i
1b560 73 20 70 6f 73 74 75 6c 61 74 65 64 20 66 6f 72  s postulated for
1b570 20 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 74   use to access t
1b580 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1b590 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65  The *pbRev value
1b5a0 20 69 73 20 73 65 74 20 74 6f 20 30 20 6f 72 64   is set to 0 ord
1b5b0 65 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  er 1 depending o
1b5c0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1b5d0 0a 2a 2a 20 70 49 64 78 20 73 68 6f 75 6c 64 20  .** pIdx should 
1b5e0 62 65 20 72 75 6e 20 69 6e 20 74 68 65 20 66 6f  be run in the fo
1b5f0 72 77 61 72 64 20 6f 72 64 65 72 20 6f 72 20 69  rward order or i
1b600 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
1b610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b620 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20  sSortingIndex(. 
1b630 20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70   WhereBestIdx *p
1b640 2c 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64  ,    /* Best ind
1b650 65 78 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78  ex search contex
1b660 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
1b670 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx,        /* Th
1b680 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
1b690 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
1b6a0 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
1b6b0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
1b6c0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
1b6d0 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
1b6e0 20 69 6e 74 20 2a 70 62 52 65 76 2c 20 20 20 20   int *pbRev,    
1b6f0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
1b700 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
1b710 65 72 20 73 63 61 6e 20 6f 66 20 70 49 64 78 20  er scan of pIdx 
1b720 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4f 62 55 6e  */.  int *pbObUn
1b730 69 71 75 65 20 20 20 20 20 2f 2a 20 4f 52 44 45  ique     /* ORDE
1b740 52 20 42 59 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  R BY column valu
1b750 65 73 20 77 69 6c 6c 20 64 69 66 66 65 72 65 6e  es will differen
1b760 74 20 69 6e 20 65 76 65 72 79 20 72 6f 77 20 2a  t in every row *
1b770 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b7a0 66 20 70 49 64 78 20 74 65 72 6d 73 20 75 73 65  f pIdx terms use
1b7b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  d */.  int j;   
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b7e0 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
1b7f0 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20   satisfied */.  
1b800 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
1b810 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
1b820 20 30 3a 20 66 6f 72 77 61 72 64 2e 20 20 31 3a   0: forward.  1:
1b830 20 62 61 63 6b 77 61 72 64 2e 20 20 32 3a 20 75   backward.  2: u
1b840 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 69 6e 74 20  nknown */.  int 
1b850 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
1b860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b870 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
1b880 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
1b890 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1b8a0 2a 70 4f 42 49 74 65 6d 3b 2f 2a 20 41 20 74 65  *pOBItem;/* A te
1b8b0 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
1b8c0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  BY clause */.  T
1b8d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
1b8e0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 20 2f 2a 20  x->pTable;   /* 
1b8f0 54 61 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  Table that owns 
1b900 69 6e 64 65 78 20 70 49 64 78 20 2a 2f 0a 20 20  index pIdx */.  
1b910 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1b920 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
1b930 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1b940 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20  ause */.  Parse 
1b950 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
1b960 72 73 65 3b 20 20 20 20 2f 2a 20 50 61 72 73 65  rse;    /* Parse
1b970 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  r context */.  s
1b980 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1b990 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
1b9a0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1b9b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ion */.  int nPr
1b9c0 69 6f 72 53 61 74 3b 20 20 20 20 20 20 20 20 20  iorSat;         
1b9d0 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
1b9e0 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
1b9f0 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70  ed by outer loop
1ba00 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 52  s */.  int seenR
1ba10 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
1ba20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ba30 61 6e 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  an ORDER BY rowi
1ba40 64 20 74 65 72 6d 20 69 73 20 73 65 65 6e 20 2a  d term is seen *
1ba50 2f 0a 20 20 69 6e 74 20 75 6e 69 71 75 65 4e 6f  /.  int uniqueNo
1ba60 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  tNull;          
1ba70 20 20 2f 2a 20 70 49 64 78 20 69 73 20 55 4e 49    /* pIdx is UNI
1ba80 51 55 45 20 77 69 74 68 20 61 6c 6c 20 74 65 72  QUE with all ter
1ba90 6d 73 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20  ms are NOT NULL 
1baa0 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 65 72 4f 62  */.  int outerOb
1bab0 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
1bac0 20 20 20 2f 2a 20 4f 75 74 65 72 20 6c 6f 6f 70     /* Outer loop
1bad0 73 20 67 65 6e 65 72 61 74 65 20 64 69 66 66 65  s generate diffe
1bae0 72 65 6e 74 20 76 61 6c 75 65 73 20 69 6e 0a 20  rent values in. 
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1bb10 2a 20 65 76 65 72 79 20 72 6f 77 20 66 6f 72 20  * every row for 
1bb20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  the ORDER BY col
1bb30 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 70  umns */..  if( p
1bb40 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ->i==0 ){.    nP
1bb50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20 20  riorSat = 0;.   
1bb60 20 6f 75 74 65 72 4f 62 55 6e 69 71 75 65 20 3d   outerObUnique =
1bb70 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1bb80 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70   u32 wsFlags = p
1bb90 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1bba0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
1bbb0 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70     nPriorSat = p
1bbc0 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1bbd0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20  .plan.nOBSat;.  
1bbe0 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
1bbf0 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d   WHERE_ORDERED)=
1bc00 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1bc10 68 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20  his loop cannot 
1bc20 62 65 20 6f 72 64 65 72 65 64 20 75 6e 6c 65 73  be ordered unles
1bc30 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72  s the next outer
1bc40 20 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20 20 2a   loop is.      *
1bc50 2a 20 61 6c 73 6f 20 6f 72 64 65 72 65 64 20 2a  * also ordered *
1bc60 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  /.      return n
1bc70 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a  PriorSat;.    }.
1bc80 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61      if( Optimiza
1bc90 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1bca0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
1bcb0 64 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  dxJoin) ){.     
1bcc0 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74   /* Only look at
1bcd0 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 20   the outer-most 
1bce0 6c 6f 6f 70 20 69 66 20 74 68 65 20 4f 72 64 65  loop if the Orde
1bcf0 72 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20 20 20  rByIdxJoin.     
1bd00 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
1bd10 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
1bd20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72        return nPr
1bd30 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20  iorSat;.    }.  
1bd40 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
1bd50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 42 5f 55  ags & WHERE_OB_U
1bd60 4e 49 51 55 45 20 29 3b 0a 20 20 20 20 74 65 73  NIQUE );.    tes
1bd70 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
1bd80 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55   WHERE_ALL_UNIQU
1bd90 45 20 29 3b 0a 20 20 20 20 6f 75 74 65 72 4f 62  E );.    outerOb
1bda0 55 6e 69 71 75 65 20 3d 20 28 77 73 46 6c 61 67  Unique = (wsFlag
1bdb0 73 20 26 20 28 57 48 45 52 45 5f 4f 42 5f 55 4e  s & (WHERE_OB_UN
1bdc0 49 51 55 45 7c 57 48 45 52 45 5f 41 4c 4c 5f 55  IQUE|WHERE_ALL_U
1bdd0 4e 49 51 55 45 29 29 21 3d 30 3b 0a 20 20 7d 0a  NIQUE))!=0;.  }.
1bde0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1bdf0 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
1be00 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
1be10 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 62  );.  if( pIdx->b
1be20 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
1be30 20 2f 2a 20 48 61 73 68 20 69 6e 64 69 63 65 73   /* Hash indices
1be40 20 28 69 6e 64 69 63 61 74 65 64 20 62 79 20 74   (indicated by t
1be50 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22 20 74  he "unordered" t
1be60 61 67 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74 61  ag on sqlite_sta
1be70 74 31 29 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a  t1) cannot.    *
1be80 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  * be used for so
1be90 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 74  rting */.    ret
1bea0 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  urn nPriorSat;. 
1beb0 20 7d 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72   }.  nTerm = pOr
1bec0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1bed0 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20  uniqueNotNull = 
1bee0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
1bef0 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73 73 65 72 74  E_None;.  assert
1bf00 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
1bf10 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  /* Argument pIdx
1bf20 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
1bf30 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e  nt to a 'real' n
1bf40 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63  amed index struc
1bf50 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61  ture, .  ** or a
1bf60 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
1bf70 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  e allocated on t
1bf80 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74  he stack by best
1bf90 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a  BtreeIndex() to.
1bfa0 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74    ** represent t
1bfb0 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74  he rowid index t
1bfc0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65  hat is part of e
1bfd0 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  very table.  */.
1bfe0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1bff0 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e  zName || (pIdx->
1c000 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
1c010 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
1c020 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =-1) );..  /* Ma
1c030 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
1c040 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c050 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
1c060 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
1c070 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
1c080 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
1c090 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
1c0a0 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
1c0b0 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
1c0c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
1c0d0 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
1c0e0 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
1c0f0 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
1c100 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
1c110 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
1c120 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
1c130 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
1c140 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6a  clause..  */.  j
1c150 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20   = nPriorSat;.  
1c160 66 6f 72 28 69 3d 30 2c 70 4f 42 49 74 65 6d 3d  for(i=0,pOBItem=
1c170 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 3b  &pOrderBy->a[j];
1c180 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70   j<nTerm && i<=p
1c190 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
1c1a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  +){.    Expr *pO
1c1b0 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  BExpr;          
1c1c0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1c1d0 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  n of the ORDER B
1c1e0 59 20 70 4f 42 49 74 65 6d 20 2a 2f 0a 20 20 20  Y pOBItem */.   
1c1f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1c200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c210 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1c220 63 65 20 6f 66 20 70 4f 42 45 78 70 72 20 2a 2f  ce of pOBExpr */
1c230 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
1c240 74 4f 72 64 65 72 3b 20 20 20 20 20 20 2f 2a 20  tOrder;      /* 
1c250 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74  Sort order for t
1c260 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1c270 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1c280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c290 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
1c2a0 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72  e index.  -1 for
1c2b0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
1c2c0 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20  t iSortOrder;   
1c2d0 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44        /* 1 for D
1c2e0 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f  ESC, 0 for ASC o
1c2f0 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  n the i-th index
1c300 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74   term */.    int
1c310 20 69 73 45 71 3b 20 20 20 20 20 20 20 20 20 20   isEq;          
1c320 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20       /* Subject 
1c330 74 6f 20 61 6e 20 3d 3d 20 6f 72 20 49 53 20 4e  to an == or IS N
1c340 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ULL constraint *
1c350 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 61 74 63  /.    int isMatc
1c360 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h;            /*
1c370 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6d   ORDER BY term m
1c380 61 74 63 68 65 73 20 74 68 65 20 69 6e 64 65 78  atches the index
1c390 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e   term */.    con
1c3a0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
1c3b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c3c0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1c3d0 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
1c3e0 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 57 68  x term */.    Wh
1c3f0 65 72 65 54 65 72 6d 20 2a 70 43 6f 6e 73 74 72  ereTerm *pConstr
1c400 61 69 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e 73 74  aint; /* A const
1c410 72 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45  raint in the WHE
1c420 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
1c430 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 78 74    /* If the next
1c440 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1c450 45 52 20 42 59 20 63 6c 61 75 73 65 20 72 65 66  ER BY clause ref
1c460 65 72 73 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ers to anything 
1c470 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  other than.    *
1c480 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  * a column in th
1c490 65 20 22 62 61 73 65 22 20 74 61 62 6c 65 2c 20  e "base" table, 
1c4a0 74 68 65 6e 20 74 68 69 73 20 69 6e 64 65 78 20  then this index 
1c4b0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 66 20 61  will not be of a
1c4c0 6e 79 0a 20 20 20 20 2a 2a 20 66 75 72 74 68 65  ny.    ** furthe
1c4d0 72 20 75 73 65 20 69 6e 20 68 61 6e 64 6c 69 6e  r use in handlin
1c4e0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20  g the ORDER BY. 
1c4f0 2a 2f 0a 20 20 20 20 70 4f 42 45 78 70 72 20 3d  */.    pOBExpr =
1c500 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1c510 43 6f 6c 6c 61 74 65 28 70 4f 42 49 74 65 6d 2d  Collate(pOBItem-
1c520 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1c530 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1c540 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45 78  _COLUMN || pOBEx
1c550 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
1c560 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1c570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1c580 69 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ind column numbe
1c590 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  r and collating 
1c5a0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
1c5b0 20 6e 65 78 74 20 65 6e 74 72 79 0a 20 20 20 20   next entry.    
1c5c0 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ** in the index 
1c5d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  */.    if( pIdx-
1c5e0 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78  >zName && i<pIdx
1c5f0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
1c600 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64     iColumn = pId
1c610 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
1c620 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1c630 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  n==pIdx->pTable-
1c640 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
1c650 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
1c660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
1c670 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d  ortOrder = pIdx-
1c680 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
1c690 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49        zColl = pI
1c6a0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
1c6b0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
1c6c0 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ll!=0 );.    }el
1c6d0 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  se{.      iColum
1c6e0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53  n = -1;.      iS
1c6f0 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  ortOrder = 0;.  
1c700 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1c710 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
1c720 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1c730 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
1c740 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
1c750 75 65 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20  uence of the.   
1c760 20 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68 20   ** index match 
1c770 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
1c780 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  r and collating 
1c790 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20  sequence of the 
1c7a0 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
1c7b0 63 6c 61 75 73 65 20 65 6e 74 72 79 2e 20 20 53  clause entry.  S
1c7c0 65 74 20 69 73 4d 61 74 63 68 20 74 6f 20 31 20  et isMatch to 1 
1c7d0 69 66 20 74 68 65 79 20 62 6f 74 68 20 6d 61 74  if they both mat
1c7e0 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ch. */.    if( p
1c7f0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  OBExpr->iColumn=
1c800 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
1c810 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20    if( zColl ){. 
1c820 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1c830 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1c840 71 28 70 50 61 72 73 65 2c 20 70 4f 42 49 74 65  q(pParse, pOBIte
1c850 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1c860 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1c870 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1c880 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  tColl;.        i
1c890 73 4d 61 74 63 68 20 3d 20 73 71 6c 69 74 65 33  sMatch = sqlite3
1c8a0 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
1c8b0 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d 30 3b  Name, zColl)==0;
1c8c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c8d0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1c8e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1c8f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4d 61  else{.      isMa
1c900 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tch = 0;.    }..
1c910 20 20 20 20 2f 2a 20 74 65 72 6d 53 6f 72 74 4f      /* termSortO
1c920 72 64 65 72 20 69 73 20 30 20 6f 72 20 31 20 66  rder is 0 or 1 f
1c930 6f 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  or whether or no
1c940 74 20 74 68 65 20 61 63 63 65 73 73 20 6c 6f 6f  t the access loo
1c950 70 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  p should.    ** 
1c960 72 75 6e 20 66 6f 72 77 61 72 64 20 6f 72 20 62  run forward or b
1c970 61 63 6b 77 61 72 64 73 20 28 72 65 73 70 65 63  ackwards (respec
1c980 74 69 76 65 6c 79 29 20 69 6e 20 6f 72 64 65 72  tively) in order
1c990 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73   to satisfy this
1c9a0 20 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6f 66   .    ** term of
1c9b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c9c0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ause. */.    ass
1c9d0 65 72 74 28 20 70 4f 42 49 74 65 6d 2d 3e 73 6f  ert( pOBItem->so
1c9e0 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 4f  rtOrder==0 || pO
1c9f0 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  BItem->sortOrder
1ca00 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
1ca10 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30  t( iSortOrder==0
1ca20 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d   || iSortOrder==
1ca30 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72  1 );.    termSor
1ca40 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72  tOrder = iSortOr
1ca50 64 65 72 20 5e 20 70 4f 42 49 74 65 6d 2d 3e 73  der ^ pOBItem->s
1ca60 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 2f  ortOrder;..    /
1ca70 2a 20 49 66 20 58 20 69 73 20 74 68 65 20 63 6f  * If X is the co
1ca80 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  lumn in the inde
1ca90 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  x and ORDER BY c
1caa0 6c 61 75 73 65 2c 20 63 68 65 63 6b 20 74 6f 20  lause, check to 
1cab0 73 65 65 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  see.    ** if th
1cac0 65 72 65 20 61 72 65 20 61 6e 79 20 58 3d 20 6f  ere are any X= o
1cad0 72 20 58 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73  r X IS NULL cons
1cae0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 57  traints in the W
1caf0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  HERE clause. */.
1cb00 20 20 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20      pConstraint 
1cb10 3d 20 66 69 6e 64 54 65 72 6d 28 70 2d 3e 70 57  = findTerm(p->pW
1cb20 43 2c 20 62 61 73 65 2c 20 69 43 6f 6c 75 6d 6e  C, base, iColumn
1cb30 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 0a 20  , p->notReady,. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51 7c            WO_EQ|
1cb60 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c  WO_ISNULL|WO_IN,
1cb70 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
1cb80 70 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 29  pConstraint==0 )
1cb90 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20 30  {.      isEq = 0
1cba0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cbb0 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65 4f  (pConstraint->eO
1cbc0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
1cbd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 45  !=0 ){.      isE
1cbe0 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  q = 0;.    }else
1cbf0 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61 69 6e   if( (pConstrain
1cc00 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
1cc10 4f 5f 49 53 4e 55 4c 4c 29 21 3d 30 20 29 7b 0a  O_ISNULL)!=0 ){.
1cc20 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e        uniqueNotN
1cc30 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ull = 0;.      i
1cc40 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22 58 20  sEq = 1;  /* "X 
1cc50 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73 20 58  IS NULL" means X
1cc60 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67   has only a sing
1cc70 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  le value */.    
1cc80 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73 74  }else if( pConst
1cc90 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52 69 67  raint->prereqRig
1cca0 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ht==0 ){.      i
1ccb0 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43 6f 6e  sEq = 1;  /* Con
1ccc0 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e 73 74  straint "X=const
1ccd0 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68 61 73  ant" means X has
1cce0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76   only a single v
1ccf0 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  alue */.    }els
1cd00 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1cd10 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74 72 61  Right = pConstra
1cd20 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  int->pExpr->pRig
1cd30 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
1cd40 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
1cd50 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  UMN ){.        /
1cd60 2a 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20  *WHERETRACE(("  
1cd70 20 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65       .. isOrdere
1cd80 64 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63  dColumn(tab=%d,c
1cd90 6f 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  ol=%d)",.       
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
1cdb0 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69  ght->iTable, pRi
1cdc0 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 2a  ght->iColumn));*
1cdd0 2f 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  /.        isEq =
1cde0 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e   isOrderedColumn
1cdf0 28 70 2c 20 70 52 69 67 68 74 2d 3e 69 54 61 62  (p, pRight->iTab
1ce00 6c 65 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  le, pRight->iCol
1ce10 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  umn);.        /*
1ce20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 2d 3e  WHERETRACE((" ->
1ce30 20 69 73 45 71 3d 25 64 5c 6e 22 2c 20 69 73 45   isEq=%d\n", isE
1ce40 71 29 29 3b 2a 2f 0a 0a 20 20 20 20 20 20 20 20  q));*/..        
1ce50 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74 72  /* If the constr
1ce60 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
1ce70 6f 72 6d 20 58 3d 59 20 77 68 65 72 65 20 59 20  orm X=Y where Y 
1ce80 69 73 20 61 6e 20 6f 72 64 65 72 65 64 20 76 61  is an ordered va
1ce90 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  lue.        ** i
1cea0 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c  n an outer loop,
1ceb0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
1cec0 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f  the sort order o
1ced0 66 20 59 20 6d 61 74 63 68 65 73 20 74 68 65 0a  f Y matches the.
1cee0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 72 74 20          ** sort 
1cef0 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 66  order required f
1cf00 6f 72 20 58 2e 20 2a 2f 0a 20 20 20 20 20 20 20  or X. */.       
1cf10 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20   if( isMatch && 
1cf20 69 73 45 71 3e 3d 32 20 26 26 20 69 73 45 71 21  isEq>=2 && isEq!
1cf30 3d 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  =pOBItem->sortOr
1cf40 64 65 72 2b 32 20 29 7b 0a 20 20 20 20 20 20 20  der+2 ){.       
1cf50 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45     testcase( isE
1cf60 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  q==2 );.        
1cf70 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71    testcase( isEq
1cf80 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==3 );.         
1cf90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cfa0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1cfb0 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 30 3b         isEq = 0;
1cfc0 20 20 2f 2a 20 22 58 3d 65 78 70 72 22 20 70 6c    /* "X=expr" pl
1cfd0 61 63 65 73 20 6e 6f 20 6f 72 64 65 72 69 6e 67  aces no ordering
1cfe0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1cff0 58 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  X */.      }.   
1d000 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 4d 61   }.    if( !isMa
1d010 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tch ){.      if(
1d020 20 69 73 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20   isEq==0 ){.    
1d030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d050 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d060 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1d070 69 73 45 71 21 3d 31 20 29 7b 0a 20 20 20 20 20  isEq!=1 ){.     
1d080 20 69 66 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d   if( sortOrder==
1d090 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 72  2 ){.        sor
1d0a0 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
1d0b0 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 65  tOrder;.      }e
1d0c0 6c 73 65 20 69 66 28 20 74 65 72 6d 53 6f 72 74  lse if( termSort
1d0d0 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
1d0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1d0f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1d100 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 4f  .    j++;.    pO
1d110 42 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28  BItem++;.    if(
1d120 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
1d130 20 20 20 20 73 65 65 6e 52 6f 77 69 64 20 3d 20      seenRowid = 
1d140 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1d150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1d160 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  ab->aCol[iColumn
1d170 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 26 26 20  ].notNull==0 && 
1d180 69 73 45 71 21 3d 31 20 29 7b 0a 20 20 20 20 20  isEq!=1 ){.     
1d190 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d   testcase( isEq=
1d1a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1d1b0 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b  case( isEq==2 );
1d1c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d1d0 20 69 73 45 71 3d 3d 33 20 29 3b 0a 20 20 20 20   isEq==3 );.    
1d1e0 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20    uniqueNotNull 
1d1f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1d200 20 69 66 28 20 73 65 65 6e 52 6f 77 69 64 20 29   if( seenRowid )
1d210 7b 0a 20 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e  {.    uniqueNotN
1d220 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ull = 1;.  }else
1d230 20 69 66 28 20 75 6e 69 71 75 65 4e 6f 74 4e 75   if( uniqueNotNu
1d240 6c 6c 3d 3d 30 20 7c 7c 20 69 3c 70 49 64 78 2d  ll==0 || i<pIdx-
1d250 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
1d260 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20  uniqueNotNull = 
1d270 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1d280 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75 6e  we have not foun
1d290 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4f  d at least one O
1d2a0 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
1d2b0 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20 20  t matches the.  
1d2c0 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 73  ** index, then s
1d2d0 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  how no progress.
1d2e0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49 74 65   */.  if( pOBIte
1d2f0 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m==&pOrderBy->a[
1d300 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72 65 74  nPriorSat] ) ret
1d310 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 0a  urn nPriorSat;..
1d320 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
1d330 6f 75 74 65 72 20 71 75 65 72 69 65 73 20 6d 75  outer queries mu
1d340 73 74 20 67 65 6e 65 72 61 74 65 20 72 6f 77 73  st generate rows
1d350 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
1d360 20 6e 6f 20 74 77 6f 0a 20 20 2a 2a 20 72 6f 77   no two.  ** row
1d370 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  s with the same 
1d380 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c 20 4f 52  values in all OR
1d390 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 2c 20  DER BY columns, 
1d3a0 6f 72 20 65 6c 73 65 20 74 68 69 73 0a 20 20 2a  or else this.  *
1d3b0 2a 20 6c 6f 6f 70 20 6d 75 73 74 20 67 65 6e 65  * loop must gene
1d3c0 72 61 74 65 20 6a 75 73 74 20 61 20 73 69 6e 67  rate just a sing
1d3d0 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
1d3e0 2e 20 20 45 78 61 6d 70 6c 65 3a 20 20 53 75 70  .  Example:  Sup
1d3f0 70 6f 73 65 0a 20 20 2a 2a 20 74 68 65 20 6f 75  pose.  ** the ou
1d400 74 65 72 20 6c 6f 6f 70 73 20 67 65 6e 65 72 61  ter loops genera
1d410 74 65 20 41 3d 31 20 61 6e 64 20 41 3d 31 2c 20  te A=1 and A=1, 
1d420 61 6e 64 20 74 68 69 73 20 6c 6f 6f 70 20 67 65  and this loop ge
1d430 6e 65 72 61 74 65 73 20 42 3d 33 0a 20 20 2a 2a  nerates B=3.  **
1d440 20 61 6e 64 20 42 3d 34 2e 20 20 54 68 65 6e 20   and B=4.  Then 
1d450 77 69 74 68 6f 75 74 20 74 68 65 20 66 6f 6c 6c  without the foll
1d460 6f 77 69 6e 67 20 74 65 73 74 2c 20 4f 52 44 45  owing test, ORDE
1d470 52 20 42 59 20 41 2c 42 20 77 6f 75 6c 64 20 0a  R BY A,B would .
1d480 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
1d490 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 20 6f 75  e wrong order ou
1d4a0 74 70 75 74 3a 20 31 2c 33 20 31 2c 34 20 31 2c  tput: 1,3 1,4 1,
1d4b0 33 20 31 2c 34 0a 20 20 2a 2f 0a 20 20 69 66 28  3 1,4.  */.  if(
1d4c0 20 6f 75 74 65 72 4f 62 55 6e 69 71 75 65 3d 3d   outerObUnique==
1d4d0 30 20 26 26 20 75 6e 69 71 75 65 4e 6f 74 4e 75  0 && uniqueNotNu
1d4e0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ll==0 ) return n
1d4f0 50 72 69 6f 72 53 61 74 3b 0a 20 20 2a 70 62 4f  PriorSat;.  *pbO
1d500 62 55 6e 69 71 75 65 20 3d 20 75 6e 69 71 75 65  bUnique = unique
1d510 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 52  NotNull;..  /* R
1d520 65 74 75 72 6e 20 74 68 65 20 6e 65 63 65 73 73  eturn the necess
1d530 61 72 79 20 73 63 61 6e 20 6f 72 64 65 72 20 62  ary scan order b
1d540 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
1d550 72 20 2a 2f 0a 20 20 2a 70 62 52 65 76 20 3d 20  r */.  *pbRev = 
1d560 73 6f 72 74 4f 72 64 65 72 20 26 20 31 3b 0a 0a  sortOrder & 1;..
1d570 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1d580 73 20 61 6e 20 22 4f 52 44 45 52 20 42 59 20 72  s an "ORDER BY r
1d590 6f 77 69 64 22 20 74 65 72 6d 20 74 68 61 74 20  owid" term that 
1d5a0 6d 61 74 63 68 65 64 2c 20 6f 72 20 69 74 20 69  matched, or it i
1d5b0 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
1d5c0 69 62 6c 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  ible for a singl
1d5d0 65 20 72 6f 77 20 66 72 6f 6d 20 74 68 69 73 20  e row from this 
1d5e0 74 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 2c 20  table to match, 
1d5f0 74 68 65 6e 20 73 6b 69 70 20 6f 76 65 72 0a 20  then skip over. 
1d600 20 2a 2a 20 61 6e 79 20 61 64 64 69 74 69 6f 6e   ** any addition
1d610 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  al ORDER BY term
1d620 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  s dealing with t
1d630 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  his table..  */.
1d640 20 20 69 66 28 20 75 6e 69 71 75 65 4e 6f 74 4e    if( uniqueNotN
1d650 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64  ull ){.    /* Ad
1d660 76 61 6e 63 65 20 6a 20 6f 76 65 72 20 61 64 64  vance j over add
1d670 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59  itional ORDER BY
1d680 20 74 65 72 6d 73 20 61 73 73 6f 63 69 61 74 65   terms associate
1d690 64 20 77 69 74 68 20 62 61 73 65 20 2a 2f 0a 20  d with base */. 
1d6a0 20 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20     WhereMaskSet 
1d6b0 2a 70 4d 53 20 3d 20 70 2d 3e 70 57 43 2d 3e 70  *pMS = p->pWC->p
1d6c0 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 42 69 74  MaskSet;.    Bit
1d6d0 6d 61 73 6b 20 6d 20 3d 20 7e 67 65 74 4d 61 73  mask m = ~getMas
1d6e0 6b 28 70 4d 53 2c 20 62 61 73 65 29 3b 0a 20 20  k(pMS, base);.  
1d6f0 20 20 77 68 69 6c 65 28 20 6a 3c 6e 54 65 72 6d    while( j<nTerm
1d700 20 26 26 20 28 65 78 70 72 54 61 62 6c 65 55 73   && (exprTableUs
1d710 61 67 65 28 70 4d 53 2c 20 70 4f 72 64 65 72 42  age(pMS, pOrderB
1d720 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 26 6d  y->a[j].pExpr)&m
1d730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 2b  )==0 ){.      j+
1d740 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
1d750 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
1d760 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74 20  * Find the best 
1d770 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
1d780 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69  ccessing a parti
1d790 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72  cular table.  Wr
1d7a0 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  ite the.** best 
1d7b0 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69  query plan and i
1d7c0 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65  ts cost into the
1d7d0 20 70 2d 3e 63 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20   p->cost..**.** 
1d7e0 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
1d7f0 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20  plan wins.  The 
1d800 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d  cost is an estim
1d810 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e  ate of the amoun
1d820 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20  t of.** CPU and 
1d830 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65 64 20  disk I/O needed 
1d840 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
1d850 65 71 75 65 73 74 65 64 20 72 65 73 75 6c 74 2e  equested result.
1d860 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74  .** Factors that
1d870 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20   influence cost 
1d880 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
1d890 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74    *  The estimat
1d8a0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
1d8b0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
1d8c0 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a  etrieved.  (The.
1d8d0 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74  **       fewer t
1d8e0 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a  he better.).**.*
1d8f0 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
1d900 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d  or not sorting m
1d910 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  ust occur..**.**
1d920 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
1d930 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74  r not there must
1d940 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f   be separate loo
1d950 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  kups in the.**  
1d960 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69       index and i
1d970 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
1d980 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1d990 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
1d9a0 42 59 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d  BY clause (pSrc-
1d9b0 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63 68 65  >pIndex) attache
1d9c0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  d to the table i
1d9d0 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
1d9e0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69  tement, then thi
1d9f0 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
1da00 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20  considers plans 
1da10 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61  using the .** na
1da20 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  med index. If no
1da30 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20 66 6f   such plan is fo
1da40 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  und, then the re
1da50 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a  turned cost is.*
1da60 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  * SQLITE_BIG_DBL
1da70 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73 20 66  . If a plan is f
1da80 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73 20 74  ound that uses t
1da90 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20  he named index, 
1daa0 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73  .** then the cos
1dab0 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  t is calculated 
1dac0 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  in the usual way
1dad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54  ..**.** If a NOT
1dae0 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
1daf0 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  was attached to 
1db00 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e  the table .** in
1db10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1db20 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69  ement, then no i
1db30 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73 69  ndexes are consi
1db40 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  dered. However, 
1db50 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64  the .** selected
1db60 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20   plan may still 
1db70 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
1db80 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 72  f the built-in r
1db90 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1dba0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  .** index..*/.st
1dbb0 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 42 74  atic void bestBt
1dbc0 72 65 65 49 6e 64 65 78 28 57 68 65 72 65 42 65  reeIndex(WhereBe
1dbd0 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72  stIdx *p){.  Par
1dbe0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
1dbf0 70 50 61 72 73 65 3b 20 20 2f 2a 20 54 68 65 20  pParse;  /* The 
1dc00 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1dc10 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1dc20 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20   *pWC = p->pWC; 
1dc30 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1dc40 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1dc50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1dc60 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f  Src = p->pSrc; /
1dc70 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1dc80 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1dc90 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
1dca0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
1dcb0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1dcc0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1dcd0 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
1dce0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd00 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
1dd10 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
1dd20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1dd40 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f  opy of pProbe, o
1dd50 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20 69  r zero for IPK i
1dd60 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71  ndex */.  int eq
1dd70 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
1dd80 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1dd90 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
1dda0 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
1ddb0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45 71  s */.  int idxEq
1ddc0 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
1ddd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b     /* Index mask
1dde0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1ddf0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1de00 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de20 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
1de30 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
1de40 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52  mary key */.  tR
1de50 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b  owcnt aiRowEstPk
1de60 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  [2];      /* The
1de70 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75   aiRowEst[] valu
1de80 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
1de90 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43  dex */.  int aiC
1dea0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
1deb0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
1dec0 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
1ded0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1dee0 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d 61 73  .  int wsFlagMas
1def0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1df00 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20  * Allowed flags 
1df10 69 6e 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  in p->cost.plan.
1df20 77 73 46 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20  wsFlag */.  int 
1df30 6e 50 72 69 6f 72 53 61 74 3b 20 20 20 20 20 20  nPriorSat;      
1df40 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
1df50 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
1df60 69 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f  ied by outer loo
1df70 70 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  ps */.  int nOrd
1df80 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
1df90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dfa0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1dfb0 2a 2f 0a 20 20 63 68 61 72 20 62 53 6f 72 74 49  */.  char bSortI
1dfc0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
1dfd0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 72 20   /* Initializer 
1dfe0 66 6f 72 20 62 53 6f 72 74 20 69 6e 20 69 6e 6e  for bSort in inn
1dff0 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61  er loop */.  cha
1e000 72 20 62 44 69 73 74 49 6e 69 74 3b 20 20 20 20  r bDistInit;    
1e010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1e020 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 44 69 73  ializer for bDis
1e030 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20  t in inner loop 
1e040 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  */...  /* Initia
1e050 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f  lize the cost to
1e060 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61   a worst-case va
1e070 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  lue */.  memset(
1e080 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
1e090 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
1e0a0 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d   p->cost.rCost =
1e0b0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
1e0c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53  ..  /* If the pS
1e0d0 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  rc table is the 
1e0e0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1e0f0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20   LEFT JOIN then 
1e100 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20  we may not.  ** 
1e110 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  use an index to 
1e120 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20  satisfy IS NULL 
1e130 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
1e140 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
1e150 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65   is.  ** because
1e160 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65   columns might e
1e170 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c  nd up being NULL
1e180 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
1e190 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20  es not match -. 
1e1a0 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e   ** a circumstan
1e1b0 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  ce which the ind
1e1c0 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75  ex cannot help u
1e1d0 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63  s discover.  Tic
1e1e0 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a  ket #2177..  */.
1e1f0 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e    if( pSrc->join
1e200 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
1e210 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
1e220 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
1e230 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  N;.  }else{.    
1e240 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1e250 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
1e260 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66  SNULL;.  }..  if
1e270 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
1e280 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
1e290 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
1e2a0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
1e2b0 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
1e2c0 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20  e */.    pIdx = 
1e2d0 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
1e2e0 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c 61  Index;.    wsFla
1e2f0 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f  gMask = ~(WHERE_
1e300 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
1e310 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
1e320 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64   eqTermMask = id
1e330 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d  xEqTermMask;.  }
1e340 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e350 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
1e360 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
1e370 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
1e380 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
1e390 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
1e3a0 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
1e3b0 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
1e3c0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
1e3d0 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
1e3e0 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
1e3f0 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
1e400 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
1e410 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
1e420 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
1e430 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
1e440 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
1e450 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1e460 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1e470 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
1e480 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
1e490 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
1e4a0 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
1e4b0 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c  ));.    sPk.nCol
1e4c0 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
1e4d0 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
1e4e0 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
1e4f0 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f  .aiRowEst = aiRo
1e500 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
1e510 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
1e520 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
1e530 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
1e540 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
1e550 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61  k[0] = pSrc->pTa
1e560 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
1e570 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
1e580 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
1e590 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
1e5a0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
1e5b0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
1e5c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1e5d0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
1e5e0 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
1e5f0 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
1e600 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
1e610 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
1e620 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
1e630 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
1e640 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
1e650 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
1e660 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
1e670 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77 73  e = &sPk;.    ws
1e680 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20  FlagMask = ~(.  
1e690 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55        WHERE_COLU
1e6a0 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
1e6b0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1e6c0 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
1e6d0 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29  LUMN_RANGE.    )
1e6e0 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
1e6f0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
1e700 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
1e710 7d 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  }..  nOrderBy = 
1e720 70 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 2d  p->pOrderBy ? p-
1e730 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1e740 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 69   : 0;.  if( p->i
1e750 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53 61   ){.    nPriorSa
1e760 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d  t = p->aLevel[p-
1e770 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >i-1].plan.nOBSa
1e780 74 3b 0a 20 20 20 20 62 53 6f 72 74 49 6e 69 74  t;.    bSortInit
1e790 20 3d 20 6e 50 72 69 6f 72 53 61 74 3c 6e 4f 72   = nPriorSat<nOr
1e7a0 64 65 72 42 79 3b 0a 20 20 20 20 62 44 69 73 74  derBy;.    bDist
1e7b0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
1e7c0 65 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74  e{.    nPriorSat
1e7d0 20 3d 20 30 3b 0a 20 20 20 20 62 53 6f 72 74 49   = 0;.    bSortI
1e7e0 6e 69 74 20 3d 20 6e 4f 72 64 65 72 42 79 3e 30  nit = nOrderBy>0
1e7f0 3b 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20  ;.    bDistInit 
1e800 3d 20 70 2d 3e 70 44 69 73 74 69 6e 63 74 21 3d  = p->pDistinct!=
1e810 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  0;.  }..  /* Loo
1e820 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
1e830 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74  es looking for t
1e840 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20 75  he best one to u
1e850 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  se.  */.  for(; 
1e860 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50 72  pProbe; pIdx=pPr
1e870 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
1e880 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 74 52  t){.    const tR
1e890 6f 77 63 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69  owcnt * const ai
1e8a0 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62 65 2d  RowEst = pProbe-
1e8b0 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  >aiRowEst;.    W
1e8c0 68 65 72 65 43 6f 73 74 20 70 63 3b 20 20 20 20  hereCost pc;    
1e8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1e8e0 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
1e8f0 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  be */.    double
1e900 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75 62 6c   log10N = (doubl
1e910 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d 31 30  e)1;  /* base-10
1e920 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 6e 52   logarithm of nR
1e930 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a 2f 0a  ow (inexact) */.
1e940 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1e950 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
1e960 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61  are populated ba
1e970 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65  sed on the prope
1e980 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  rties of.    ** 
1e990 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c  index being eval
1e9a0 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65 20  uated. They are 
1e9b0 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74  then used to det
1e9c0 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63  ermine the expec
1e9d0 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  ted.    ** cost 
1e9e0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  and number of ro
1e9f0 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  ws returned..   
1ea00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 70 63 2e 70   **.    **  pc.p
1ea10 6c 61 6e 2e 6e 45 71 3a 20 0a 20 20 20 20 2a 2a  lan.nEq: .    **
1ea20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71      Number of eq
1ea30 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61  uality terms tha
1ea40 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65  t can be impleme
1ea50 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  nted using the i
1ea60 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ndex..    **    
1ea70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ea80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
1ea90 69 74 69 61 6c 20 66 69 65 6c 64 73 20 69 6e 20  itial fields in 
1eaa0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 0a 20  the index that. 
1eab0 20 20 20 2a 2a 20 20 20 20 61 72 65 20 75 73 65     **    are use
1eac0 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20 6f 72  d in == or IN or
1ead0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
1eae0 61 69 6e 74 73 20 6f 66 20 74 68 65 20 57 48 45  aints of the WHE
1eaf0 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  RE clause..    *
1eb00 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c  *.    **  nInMul
1eb10 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68  :  .    **    Th
1eb20 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72  e "in-multiplier
1eb30 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 73  ". This is an es
1eb40 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61  timate of how ma
1eb50 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ny seek operatio
1eb60 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51  ns .    **    SQ
1eb70 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72  Lite must perfor
1eb80 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69  m on the index i
1eb90 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20  n question. For 
1eba0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1ebb0 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45  .    **    WHERE
1ebc0 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20   clause is:.    
1ebd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
1ebe0 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c  HERE a IN (1, 2,
1ebf0 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c   3) AND b IN (4,
1ec00 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20   5, 6).    **.  
1ec10 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1ec20 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f  ust perform 9 lo
1ec30 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65  okups on an inde
1ec40 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20  x on (a, b), so 
1ec50 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a  nInMul is .    *
1ec60 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47  *    set to 9. G
1ec70 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63  iven the same sc
1ec80 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20  hema and either 
1ec90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1eca0 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20   WHERE .    **  
1ecb0 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a    clauses:.    *
1ecc0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  *.    **      WH
1ecd0 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a  ERE a =  1.    *
1ece0 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3e  *      WHERE a >
1ecf0 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  = 2.    **.    *
1ed00 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73  *    nInMul is s
1ed10 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a  et to 1..    **.
1ed20 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65      **    If the
1ed30 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45 52  re exists a WHER
1ed40 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  E term of the fo
1ed50 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  rm "x IN (SELECT
1ed60 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20   ...)", then .  
1ed70 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d    **    the sub-
1ed80 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65  select is assume
1ed90 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72  d to return 25 r
1eda0 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72 70  ows for the purp
1edb0 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20  oses of .    ** 
1edc0 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e     determining n
1edd0 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  InMul..    **.  
1ede0 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a    **  bInEst:  .
1edf0 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f      **    Set to
1ee00 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20 77   true if there w
1ee10 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
1ee20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
1ee30 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20  .)" term used . 
1ee40 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65     **    in dete
1ee50 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  rmining the valu
1ee60 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f  e of nInMul.  No
1ee70 74 65 20 74 68 61 74 20 74 68 65 20 52 48 53 20  te that the RHS 
1ee80 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20  of the.    **   
1ee90 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
1eea0 74 20 62 65 20 61 20 53 45 4c 45 43 54 2c 20 6e  t be a SELECT, n
1eeb0 6f 74 20 61 20 76 61 6c 75 65 20 6c 69 73 74 2c  ot a value list,
1eec0 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61 62   for this variab
1eed0 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f 20  le.    **    to 
1eee0 62 65 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a 0a  be true..    **.
1eef0 20 20 20 20 2a 2a 20 20 72 61 6e 67 65 44 69 76      **  rangeDiv
1ef00 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20 65  :.    **    An e
1ef10 73 74 69 6d 61 74 65 20 6f 66 20 61 20 64 69 76  stimate of a div
1ef20 69 73 6f 72 20 62 79 20 77 68 69 63 68 20 74 6f  isor by which to
1ef30 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
1ef40 63 68 20 73 70 61 63 65 20 64 75 65 0a 20 20 20  ch space due.   
1ef50 20 2a 2a 20 20 20 20 74 6f 20 69 6e 65 71 75 61   **    to inequa
1ef60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ef70 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  .  In the absenc
1ef80 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
1ef90 33 20 41 4e 41 4c 59 5a 45 0a 20 20 20 20 2a 2a  3 ANALYZE.    **
1efa0 20 20 20 20 64 61 74 61 2c 20 61 20 73 69 6e 67      data, a sing
1efb0 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65  le inequality re
1efc0 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
1efd0 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72 64 20   space to 1/4rd 
1efe0 69 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6f 72  its.    **    or
1eff0 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e  iginal size (ran
1f000 67 65 44 69 76 3d 3d 34 29 2e 20 20 54 77 6f 20  geDiv==4).  Two 
1f010 69 6e 65 71 75 61 6c 69 74 69 65 73 20 72 65 64  inequalities red
1f020 75 63 65 20 74 68 65 20 73 65 61 72 63 68 0a 20  uce the search. 
1f030 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65 20 74     **    space t
1f040 6f 20 31 2f 31 36 74 68 20 6f 66 20 69 74 73 20  o 1/16th of its 
1f050 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72  original size (r
1f060 61 6e 67 65 44 69 76 3d 3d 31 36 29 2e 0a 20 20  angeDiv==16)..  
1f070 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f    **.    **  bSo
1f080 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20  rt:   .    **   
1f090 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
1f0a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1f0b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68  DER BY clause th
1f0c0 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
1f0d0 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78  an .    **    ex
1f0e0 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65  ternal sort (i.e
1f0f0 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69  . scanning the i
1f100 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75  ndex being evalu
1f110 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20  ated will not . 
1f120 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74     **    correct
1f130 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73  ly order records
1f140 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
1f150 20 20 62 44 69 73 74 3a 0a 20 20 20 20 2a 2a 20    bDist:.    ** 
1f160 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1f170 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 44   if there is a D
1f180 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1f190 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
1f1a0 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65   an .    **    e
1f1b0 78 74 65 72 6e 61 6c 20 62 74 72 65 65 2e 0a 20  xternal btree.. 
1f1c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c     **.    **  bL
1f1d0 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20  ookup: .    **  
1f1e0 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
1f1f0 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  if a table looku
1f200 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  p is required fo
1f210 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74  r each index ent
1f220 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73  ry.    **    vis
1f230 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20  ited.  In other 
1f240 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20 74  words, true if t
1f250 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76  his is not a cov
1f260 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
1f270 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20 61   **    This is a
1f280 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20  lways false for 
1f290 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72  the rowid primar
1f2a0 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61  y key index of a
1f2b0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20   table..    **  
1f2c0 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65    For other inde
1f2d0 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65 20  xes, it is true 
1f2e0 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63  unless all the c
1f2f0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1f300 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73  ble.    **    us
1f310 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
1f320 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70   statement are p
1f330 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
1f340 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20  dex (such an.   
1f350 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20   **    index is 
1f360 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
1f370 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
1f380 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
1f390 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
1f3a0 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
1f3b0 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
1f3c0 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
1f3d0 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
1f3e0 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
1f3f0 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
1f400 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  tree lookups in 
1f410 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68  order to find th
1f420 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20  e value.    **  
1f430 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62    of column c, b
1f440 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65  ut the first doe
1f450 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f  s not because co
1f460 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72  lumns a and b ar
1f470 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68  e.    **    both
1f480 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1f490 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  e index..    **.
1f4a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f4b0 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20     SELECT a, b  
1f4c0 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45    FROM tbl WHERE
1f4d0 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20   a = 1;.    **  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1f4f0 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
1f500 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1f510 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
1f520 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20  InEst = 0;      
1f530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f540 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43   if "x IN (SELEC
1f550 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20  T...)" seen */. 
1f560 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20     int nInMul = 
1f570 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1f580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
1f590 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65  stinct equalitie
1f5a0 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  s to lookup */. 
1f5b0 20 20 20 64 6f 75 62 6c 65 20 72 61 6e 67 65 44     double rangeD
1f5c0 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20  iv = (double)1; 
1f5d0 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65   /* Estimated re
1f5e0 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63  duction in searc
1f5f0 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  h space */.    i
1f600 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20  nt nBound = 0;  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f620 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20  Number of range 
1f630 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e  constraints seen
1f640 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 53 6f   */.    char bSo
1f650 72 74 20 3d 20 62 53 6f 72 74 49 6e 69 74 3b 20  rt = bSortInit; 
1f660 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f670 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72   external sort r
1f680 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 63  equired */.    c
1f690 68 61 72 20 62 44 69 73 74 20 3d 20 62 44 69 73  har bDist = bDis
1f6a0 74 49 6e 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  tInit;       /* 
1f6b0 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63 61  True if index ca
1f6c0 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44  nnot help with D
1f6d0 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 63  ISTINCT */.    c
1f6e0 68 61 72 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b  har bLookup = 0;
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f700 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f  True if not a co
1f710 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1f720 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f730 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1f740 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
1f750 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1f760 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66  clause */.#ifdef
1f770 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f780 54 41 54 33 0a 20 20 20 20 57 68 65 72 65 54 65  TAT3.    WhereTe
1f790 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d  rm *pFirstTerm =
1f7a0 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20   0;    /* First 
1f7b0 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68  term matching th
1f7c0 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69  e index */.#endi
1f7d0 66 0a 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52  f..    /*WHERETR
1f7e0 41 43 45 28 28 0a 20 20 20 20 20 20 22 20 20 20  ACE((.      "   
1f7f0 25 73 28 25 73 29 3a 5c 6e 22 2c 0a 20 20 20 20  %s(%s):\n",.    
1f800 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e    pSrc->pTab->zN
1f810 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64  ame, (pIdx ? pId
1f820 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22  x->zName : "ipk"
1f830 29 0a 20 20 20 20 29 29 3b 2a 2f 0a 20 20 20 20  ).    ));*/.    
1f840 6d 65 6d 73 65 74 28 26 70 63 2c 20 30 2c 20 73  memset(&pc, 0, s
1f850 69 7a 65 6f 66 28 70 63 29 29 3b 0a 20 20 20 20  izeof(pc));.    
1f860 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  pc.plan.nOBSat =
1f870 20 6e 50 72 69 6f 72 53 61 74 3b 0a 0a 20 20 20   nPriorSat;..   
1f880 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1f890 65 20 76 61 6c 75 65 73 20 6f 66 20 70 63 2e 70  e values of pc.p
1f8a0 6c 61 6e 2e 6e 45 71 20 61 6e 64 20 6e 49 6e 4d  lan.nEq and nInM
1f8b0 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 63  ul */.    for(pc
1f8c0 2e 70 6c 61 6e 2e 6e 45 71 3d 30 3b 20 70 63 2e  .plan.nEq=0; pc.
1f8d0 70 6c 61 6e 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  plan.nEq<pProbe-
1f8e0 3e 6e 43 6f 6c 75 6d 6e 3b 20 70 63 2e 70 6c 61  >nColumn; pc.pla
1f8f0 6e 2e 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20  n.nEq++){.      
1f900 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
1f910 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e  aiColumn[pc.plan
1f920 2e 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  .nEq];.      pTe
1f930 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
1f940 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e  C, iCur, j, p->n
1f950 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d  otReady, eqTermM
1f960 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ask, pIdx);.    
1f970 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
1f980 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
1f990 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1f9a0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45   (WHERE_COLUMN_E
1f9b0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  Q|WHERE_ROWID_EQ
1f9c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f9d0 65 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70  e( pTerm->pWC!=p
1f9e0 57 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  WC );.      if( 
1f9f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fa00 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1fa10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1fa20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1fa30 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1fa40 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1fa50 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
1fa60 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1fa70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1fa80 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1fa90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20            /* "x 
1faa0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1fab0 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45  :  Assume the SE
1fac0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
1fad0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
1fae0 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a    nInMul *= 25;.
1faf0 20 20 20 20 20 20 20 20 20 20 62 49 6e 45 73 74            bInEst
1fb00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
1fb10 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
1fb20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
1fb30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1fb40 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
1fb50 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
1fb60 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
1fb70 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  )" */.          
1fb80 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d  nInMul *= pExpr-
1fb90 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
1fba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fbb0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1fbc0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1fbd0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1fbe0 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1fbf0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1fc00 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  MN_NULL;.      }
1fc10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fc20 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
1fc30 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45    if( pc.plan.nE
1fc40 71 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==0 && pProbe->
1fc50 61 53 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74  aSample ) pFirst
1fc60 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65  Term = pTerm;.#e
1fc70 6e 64 69 66 0a 20 20 20 20 20 20 70 63 2e 75 73  ndif.      pc.us
1fc80 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  ed |= pTerm->pre
1fc90 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
1fca0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1fcb0 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73  index being cons
1fcc0 69 64 65 72 65 64 20 69 73 20 55 4e 49 51 55 45  idered is UNIQUE
1fcd0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  , and there is a
1fce0 6e 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  n equality .    
1fcf0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  ** constraint fo
1fd00 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  r all columns in
1fd10 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e   the index, then
1fd20 20 74 68 69 73 20 73 65 61 72 63 68 20 77 69 6c   this search wil
1fd30 6c 20 66 69 6e 64 0a 20 20 20 20 2a 2a 20 61 74  l find.    ** at
1fd40 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72   most a single r
1fd50 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ow. In this case
1fd60 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 55   set the WHERE_U
1fd70 4e 49 51 55 45 20 66 6c 61 67 20 74 6f 20 0a 20  NIQUE flag to . 
1fd80 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
1fd90 68 69 73 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  his to the calle
1fda0 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
1fdb0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1fdc0 68 65 20 73 65 61 72 63 68 20 6d 61 79 20 66 69  he search may fi
1fdd0 6e 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  nd more than one
1fde0 20 72 6f 77 2c 20 74 65 73 74 20 74 6f 20 73 65   row, test to se
1fdf0 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72  e if.    ** ther
1fe00 65 20 69 73 20 61 20 72 61 6e 67 65 20 63 6f 6e  e is a range con
1fe10 73 74 72 61 69 6e 74 20 6f 6e 20 69 6e 64 65 78  straint on index
1fe20 65 64 20 63 6f 6c 75 6d 6e 20 28 70 63 2e 70 6c  ed column (pc.pl
1fe30 61 6e 2e 6e 45 71 2b 31 29 20 74 68 61 74 0a 20  an.nEq+1) that. 
1fe40 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74     ** can be opt
1fe50 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
1fe60 20 69 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a   index. .    */.
1fe70 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
1fe80 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1fe90 6c 75 6d 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e  lumn && pProbe->
1fea0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
1feb0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1fec0 73 65 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c  se( pc.plan.wsFl
1fed0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1fee0 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  MN_IN );.      t
1fef0 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e  estcase( pc.plan
1ff00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1ff10 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a  _COLUMN_NULL );.
1ff20 20 20 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c        if( (pc.pl
1ff30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
1ff40 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1ff50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
1ff60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1ff70 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1ff80 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
1ff90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1ffa0 69 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61 4c 65 76  i==0 || (p->aLev
1ffb0 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e  el[p->i-1].plan.
1ffc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ffd0 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29  ALL_UNIQUE)!=0 )
1ffe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70  {.          pc.p
1fff0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
20000 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 3b  HERE_ALL_UNIQUE;
20010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20020 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
20030 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
20040 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
20050 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 6a 20 3d  int j;.      j =
20060 20 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70   (pc.plan.nEq==p
20070 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f  Probe->nColumn ?
20080 20 2d 31 20 3a 20 70 50 72 6f 62 65 2d 3e 61 69   -1 : pProbe->ai
20090 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e  Column[pc.plan.n
200a0 45 71 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq]);.      if( 
200b0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
200c0 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
200d0 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
200e0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
200f0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  x) ){.        Wh
20100 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a  ereTerm *pTop, *
20110 70 42 74 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  pBtm;.        pT
20120 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  op = findTerm(pW
20130 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e  C, iCur, j, p->n
20140 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
20150 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_LE, pIdx);.   
20160 20 20 20 20 20 70 42 74 6d 20 3d 20 66 69 6e 64       pBtm = find
20170 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
20180 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
20190 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
201a0 78 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  x);.        wher
201b0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
201c0 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 63  arse, pProbe, pc
201d0 2e 70 6c 61 6e 2e 6e 45 71 2c 20 70 42 74 6d 2c  .plan.nEq, pBtm,
201e0 20 70 54 6f 70 2c 20 26 72 61 6e 67 65 44 69 76   pTop, &rangeDiv
201f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20200 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Top ){.         
20210 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   nBound = 1;.   
20220 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
20230 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20240 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
20250 20 20 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20       pc.used |= 
20260 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68  pTop->prereqRigh
20270 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
20280 74 63 61 73 65 28 20 70 54 6f 70 2d 3e 70 57 43  tcase( pTop->pWC
20290 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20  !=pWC );.       
202a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
202b0 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Btm ){.         
202c0 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20   nBound++;.     
202d0 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
202e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
202f0 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
20300 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 42     pc.used |= pB
20310 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
20320 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
20330 61 73 65 28 20 70 42 74 6d 2d 3e 70 57 43 21 3d  ase( pBtm->pWC!=
20340 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  pWC );.        }
20350 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
20360 2e 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45  .wsFlags |= (WHE
20370 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
20380 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
20390 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
203a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
203b0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
203c0 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
203d0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
203e0 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20  sidered will.   
203f0 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63   ** naturally sc
20400 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  an rows in the r
20410 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73  equired order, s
20420 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  et the appropria
20430 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20  te flags.    ** 
20440 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  in pc.plan.wsFla
20450 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  gs. Otherwise, i
20460 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
20470 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 75  DER BY clause bu
20480 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  t.    ** the ind
20490 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ex will scan row
204a0 73 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  s in a different
204b0 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20   order, set the 
204c0 62 53 6f 72 74 0a 20 20 20 20 2a 2a 20 76 61 72  bSort.    ** var
204d0 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
204e0 66 28 20 62 53 6f 72 74 20 26 26 20 28 70 53 72  f( bSort && (pSr
204f0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
20500 5f 4c 45 46 54 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEFT)==0 ){.   
20510 20 20 20 69 6e 74 20 62 52 65 76 20 3d 20 32 3b     int bRev = 2;
20520 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 62 55 6e  .      int bObUn
20530 69 71 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ique = 0;.      
20540 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22 20  /*WHERETRACE((" 
20550 20 20 20 20 20 2d 2d 3e 20 62 65 66 6f 72 65 20       --> before 
20560 69 73 53 6f 72 74 49 6e 64 65 78 3a 20 6e 50 72  isSortIndex: nPr
20570 69 6f 72 53 61 74 3d 25 64 5c 6e 22 2c 6e 50 72  iorSat=%d\n",nPr
20580 69 6f 72 53 61 74 29 29 3b 2a 2f 0a 20 20 20 20  iorSat));*/.    
20590 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74    pc.plan.nOBSat
205a0 20 3d 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65   = isSortingInde
205b0 78 28 70 2c 20 70 50 72 6f 62 65 2c 20 69 43 75  x(p, pProbe, iCu
205c0 72 2c 20 26 62 52 65 76 2c 20 26 62 4f 62 55 6e  r, &bRev, &bObUn
205d0 69 71 75 65 29 3b 0a 20 20 20 20 20 20 2f 2a 57  ique);.      /*W
205e0 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 20  HERETRACE(("    
205f0 20 20 2d 2d 3e 20 61 66 74 65 72 20 20 69 73 53    --> after  isS
20600 6f 72 74 49 6e 64 65 78 3a 20 62 52 65 76 3d 25  ortIndex: bRev=%
20610 64 20 62 4f 62 55 3d 25 64 20 6e 4f 42 53 61 74  d bObU=%d nOBSat
20620 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
20630 20 20 20 20 20 20 20 20 20 20 62 52 65 76 2c 20            bRev, 
20640 62 4f 62 55 6e 69 71 75 65 2c 20 70 63 2e 70 6c  bObUnique, pc.pl
20650 61 6e 2e 6e 4f 42 53 61 74 29 29 3b 2a 2f 0a 20  an.nOBSat));*/. 
20660 20 20 20 20 20 69 66 28 20 6e 50 72 69 6f 72 53       if( nPriorS
20670 61 74 3c 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61  at<pc.plan.nOBSa
20680 74 20 7c 7c 20 28 70 63 2e 70 6c 61 6e 2e 77 73  t || (pc.plan.ws
20690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
206a0 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  L_UNIQUE)!=0 ){.
206b0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
206c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
206d0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20  _ORDERED;.      
206e0 20 20 69 66 28 20 62 4f 62 55 6e 69 71 75 65 20    if( bObUnique 
206f0 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  ) pc.plan.wsFlag
20700 73 20 7c 3d 20 57 48 45 52 45 5f 4f 42 5f 55 4e  s |= WHERE_OB_UN
20710 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IQUE;.      }.  
20720 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79      if( nOrderBy
20730 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ==pc.plan.nOBSat
20740 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
20750 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
20760 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
20770 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
20780 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
20790 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a  _RANGE;.      }.
207a0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 26        if( bRev &
207b0 20 31 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46   1 ) pc.plan.wsF
207c0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
207d0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
207e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
207f0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
20800 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
20810 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
20820 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
20830 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
20840 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
20850 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
20860 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
20870 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
20880 73 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46  s in pc.plan.wsF
20890 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
208a0 20 62 44 69 73 74 0a 20 20 20 20 20 26 26 20 69   bDist.     && i
208b0 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
208c0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
208d0 62 65 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69  be, iCur, p->pDi
208e0 73 74 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e  stinct, pc.plan.
208f0 6e 45 71 29 0a 20 20 20 20 20 26 26 20 28 70 63  nEq).     && (pc
20900 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
20910 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
20920 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
20930 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
20940 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
20950 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
20960 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
20970 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
20980 44 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a  DISTINCT;.    }.
20990 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
209a0 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
209b0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
209c0 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
209d0 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
209e0 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
209f0 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
20a00 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
20a10 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
20a20 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
20a30 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
20a40 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
20a50 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
20a60 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
20a70 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
20a80 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
20a90 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
20aa0 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
20ab0 2a 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  * pc.plan.wsFlag
20ac0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
20ad0 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
20ae0 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
20af0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
20b00 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
20b10 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
20b20 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
20b30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
20b40 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
20b50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
20b60 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
20b70 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
20b80 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
20b90 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
20ba0 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
20bb0 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
20bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20bd0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
20be0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
20bf0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
20c00 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
20c10 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
20c20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
20c30 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
20c40 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
20c50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
20c60 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
20c70 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
20c80 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
20c90 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
20ca0 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
20cb0 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
20cc0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
20cd0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  e..    */.    pc
20ce0 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f  .plan.nRow = (do
20cf0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70  uble)(aiRowEst[p
20d00 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49  c.plan.nEq] * nI
20d10 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
20d20 49 6e 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e  InEst && pc.plan
20d30 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74  .nRow*2>aiRowEst
20d40 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e  [0] ){.      pc.
20d50 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f  plan.nRow = aiRo
20d60 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
20d70 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
20d80 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61  pc.plan.nRow / a
20d90 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e  iRowEst[pc.plan.
20da0 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
20db0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20dc0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
20dd0 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
20de0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
20df0 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
20e00 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
20e10 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
20e20 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
20e30 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
20e40 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
20e50 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
20e60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
20e70 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
20e80 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
20e90 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
20ea0 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
20eb0 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
20ec0 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
20ed0 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
20ee0 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
20ef0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
20f00 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
20f10 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
20f20 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61  /.    if( pc.pla
20f30 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  n.nRow>(double)1
20f40 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d   && pc.plan.nEq=
20f50 3d 31 0a 20 20 20 20 20 26 26 20 70 46 69 72 73  =1.     && pFirs
20f60 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
20f70 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
20f80 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
20f90 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
20fa0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
20fb0 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
20fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
20fd0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
20fe0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
20ff0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
21000 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
21010 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
21020 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
21030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21040 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
21050 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
21060 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
21070 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
21080 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
21090 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
210a0 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e    whereEqualScan
210b0 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
210c0 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
210d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20  pExpr->pRight,. 
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210f0 20 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61           &pc.pla
21100 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  n.nRow);.      }
21110 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d  else if( bInEst=
21120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
21130 73 65 72 74 28 20 70 46 69 72 73 74 54 65 72 6d  sert( pFirstTerm
21140 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21150 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77  _IN );.        w
21160 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
21170 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
21180 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
21190 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  >x.pList,.      
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b   &pc.plan.nRow);
211c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
211d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
211e0 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a  ENABLE_STAT3 */.
211f0 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74  .    /* Adjust t
21200 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
21210 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77  put rows and dow
21220 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74  nward to reflect
21230 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61   rows.    ** tha
21240 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62  t are excluded b
21250 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  y range constrai
21260 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
21270 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 70  pc.plan.nRow = p
21280 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e 67  c.plan.nRow/rang
21290 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70 63  eDiv;.    if( pc
212a0 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20 70  .plan.nRow<1 ) p
212b0 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31 3b  c.plan.nRow = 1;
212c0 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d  ..    /* Experim
212d0 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c  ents run on real
212e0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
212f0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  s show that the 
21300 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20  time needed.    
21310 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72  ** to do a binar
21320 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61  y search to loca
21330 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61  te a row in a ta
21340 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
21350 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c  roughly.    ** l
21360 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68  og10(N) times th
21370 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66  e time to move f
21380 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74  rom one row to t
21390 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68  he next row with
213a0 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c  in.    ** a tabl
213b0 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65  e or index.  The
213c0 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61   actual times ca
213d0 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65  n vary, with the
213e0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
213f0 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e  records being an
21400 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f   important facto
21410 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61  r.  Both moves a
21420 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a  nd searches are.
21430 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69      ** slower wi
21440 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  th larger record
21450 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65  s, presumably be
21460 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f  cause fewer reco
21470 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f  rds fit.    ** o
21480 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68  n one page and h
21490 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20  ence more pages 
214a0 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68  have to be fetch
214b0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
214c0 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  * The ANALYZE co
214d0 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71  mmand and the sq
214e0 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
214f0 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c  qlite_stat3 tabl
21500 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  es do.    ** not
21510 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e   give us data on
21520 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
21530 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64  zes of table and
21540 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a   index records..
21550 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63      ** So this c
21560 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d  omputation assum
21570 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  es table records
21580 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65   are about twice
21590 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61   as big.    ** a
215a0 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  s index records.
215b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
215c0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  pc.plan.wsFlags&
215d0 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45 7c  ~(WHERE_REVERSE|
215e0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 7c 57 48  WHERE_ORDERED|WH
215f0 45 52 45 5f 4f 42 5f 55 4e 49 51 55 45 29 29 0a  ERE_OB_UNIQUE)).
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d                ==
21640 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 0a 20  WHERE_IDX_ONLY. 
21650 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77 63 74      && (pWC->wct
21660 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21670 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
21680 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
21690 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
216a0 62 55 73 65 43 69 73 0a 20 20 20 20 20 26 26 20  bUseCis.     && 
216b0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
216c0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
216d0 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
216e0 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  can).    ){.    
216f0 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
21700 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
21710 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75 74 20  r indexing, but 
21720 69 74 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  it is a covering
21730 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a   index..      **
21740 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f 66 20   A full-scan of 
21750 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68 74 20  the index might 
21760 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  be a little fast
21770 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d 73  er than a full-s
21780 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  can.      ** of 
21790 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20 67 69  the table, so gi
217a0 76 65 20 74 68 69 73 20 63 61 73 65 20 61 20 63  ve this case a c
217b0 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c 65 73  ost slightly les
217c0 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65 0a 20  s than a table. 
217d0 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20 2a 2f       ** scan. */
217e0 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20  .      pc.rCost 
217f0 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33 20  = aiRowEst[0]*3 
21800 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  + pProbe->nColum
21810 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  n;.      pc.plan
21820 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
21830 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57 48 45  E_COVER_SCAN|WHE
21840 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
21850 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
21860 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
21870 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
21880 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
21890 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
218a0 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
218b0 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  an is a number o
218c0 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e  f move operation
218d0 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a  s equal.      **
218e0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
218f0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
21900 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ble..      **.  
21910 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e      ** We add an
21920 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70   additional 4x p
21930 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74  enalty to full t
21940 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69  able scans.  Thi
21950 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a  s causes.      *
21960 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74  * the cost funct
21970 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68  ion to err on th
21980 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69  e side of choosi
21990 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72  ng an index over
219a0 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69  .      ** choosi
219b0 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20  ng a full scan. 
219c0 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63   This 4x full-sc
219d0 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e  an penalty is an
219e0 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20   arguable.      
219f0 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20  ** decision and 
21a00 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78 70  one which we exp
21a10 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20 69  ect to revisit i
21a20 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20 42  n the future.  B
21a30 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73  ut.      ** it s
21a40 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69  eems to be worki
21a50 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61  ng well enough a
21a60 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t the moment..  
21a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 2e      */.      pc.
21a80 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74  rCost = aiRowEst
21a90 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70 63 2e  [0]*4;.      pc.
21aa0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
21ab0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
21ac0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
21ad0 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  ){.        pc.pl
21ae0 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  an.wsFlags &= ~W
21af0 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20 20  HERE_ORDERED;.  
21b00 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f        pc.plan.nO
21b10 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  BSat = nPriorSat
21b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21b30 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30  lse{.      log10
21b40 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77  N = estLog(aiRow
21b50 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70  Est[0]);.      p
21b60 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70 6c 61  c.rCost = pc.pla
21b70 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  n.nRow;.      if
21b80 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
21b90 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b    if( bLookup ){
21ba0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
21bb0 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  r an index looku
21bc0 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  p followed by a 
21bd0 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20  table lookup:.  
21be0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
21bf0 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63  nMul index searc
21c00 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
21c10 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e  start of each in
21c20 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20  dex range.      
21c30 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
21c40 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
21c50 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
21c60 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c   **  + nRow tabl
21c70 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f  e searches to lo
21c80 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20 65  okup the table e
21c90 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 72  ntry using the r
21ca0 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a  owid.          *
21cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 72  /.          pc.r
21cc0 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20  Cost += (nInMul 
21cd0 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a  + pc.plan.nRow)*
21ce0 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
21cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21d00 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72 69   /* For a coveri
21d10 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20 20  ng index:.      
21d20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d 75      **     nInMu
21d30 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73  l index searches
21d40 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69   to find the ini
21d50 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
21d60 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52 6f        **   + nRo
21d70 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20  w steps through 
21d80 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
21d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21da0 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49 6e   pc.rCost += nIn
21db0 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
21dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21dd0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  e{.        /* Fo
21de0 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72  r a rowid primar
21df0 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20  y key lookup:.  
21e00 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
21e10 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63 68  ult table search
21e20 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
21e30 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72  nitial entry for
21e40 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20   each range.    
21e50 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
21e60 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
21e70 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
21e80 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f  /.        pc.rCo
21e90 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67  st += nInMul*log
21ea0 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  10N;.      }.   
21eb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69   }..    /* Add i
21ec0 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  n the estimated 
21ed0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
21ee0 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74  the result.  Act
21ef0 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ual experimental
21f00 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d  .    ** measurem
21f10 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20  ents of sorting 
21f20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53  performance in S
21f30 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74 20  QLite show that 
21f40 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20  sorting time.   
21f50 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67   ** adds C*N*log
21f60 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73  10(N) to the cos
21f70 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  t, where N is th
21f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
21f90 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
21fa0 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20 61  orted and C is a
21fb0 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20   factor between 
21fc0 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57  1.95 and 4.3.  W
21fd0 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65  e will split the
21fe0 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  .    ** differen
21ff0 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20  ce and select C 
22000 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20  of 3.0..    */. 
22010 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a     if( bSort ){.
22020 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d 20 3d        double m =
22030 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e   estLog(pc.plan.
22040 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79 20 2d  nRow*(nOrderBy -
22050 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 29   pc.plan.nOBSat)
22060 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  /nOrderBy);.    
22070 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65 29 28    m *= (double)(
22080 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3f  pc.plan.nOBSat ?
22090 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20 20 70   2 : 3);.      p
220a0 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70 6c  c.rCost += pc.pl
220b0 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20 20 7d  an.nRow*m;.    }
220c0 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20 29  .    if( bDist )
220d0 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  {.      pc.rCost
220e0 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77   += pc.plan.nRow
220f0 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e  *estLog(pc.plan.
22100 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a  nRow)*3;.    }..
22110 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
22120 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
22130 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
22140 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
22150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
22160 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
22170 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
22180 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
22190 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
221a0 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
221b0 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
221c0 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
221d0 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
221e0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
221f0 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
22200 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
22210 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
22220 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
22230 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
22240 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
22250 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
22260 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
22270 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
22280 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
22290 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
222a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
222b0 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
222c0 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
222d0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
222e0 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
222f0 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
22300 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
22310 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
22320 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
22330 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
22340 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
22350 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
22360 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
22370 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
22380 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
22390 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
223a0 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
223b0 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
223c0 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
223d0 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
223e0 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
223f0 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
22400 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
22410 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
22420 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
22430 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
22440 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
22450 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
22460 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
22470 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
22480 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
22490 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
224a0 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
224b0 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
224c0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
224d0 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
224e0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
224f0 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
22500 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
22510 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
22520 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22530 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20   pc.plan.nRow>2 
22540 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70 2d 3e  && pc.rCost<=p->
22550 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20  cost.rCost ){.  
22560 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22590 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53   */.      int nS
225a0 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61 6e 2e  kipEq = pc.plan.
225b0 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  nEq;   /* Number
225c0 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e   of == constrain
225d0 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ts to skip */.  
225e0 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e      int nSkipRan
225f0 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20  ge = nBound;    
22600 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20   /* Number of < 
22610 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73  constraints to s
22620 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74  kip */.      Bit
22630 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20  mask thisTab;   
22640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
22650 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a  map for pSrc */.
22660 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20 3d  .      thisTab =
22670 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
22680 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
22690 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
226a0 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
226b0 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  erm; pc.plan.nRo
226c0 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70  w>2 && k; k--, p
226d0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
226e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
226f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
22700 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
22710 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
22720 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
22730 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68 69  ->notValid)!=thi
22740 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sTab ) continue;
22750 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
22760 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
22770 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f  (WO_EQ|WO_IN|WO_
22780 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
22790 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 45 71       if( nSkipEq
227a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
227b0 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69  /* Ignore the fi
227c0 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20  rst pc.plan.nEq 
227d0 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
227e0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
227f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22800 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
22810 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
22820 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
22830 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
22840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22850 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
22860 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
22870 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
22880 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
22890 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
228a0 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
228b0 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
228c0 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70              pc.p
228d0 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a  lan.nRow /= 10;.
228e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
228f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
22900 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
22910 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
22920 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
22930 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69          if( nSki
22940 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20  pRange ){.      
22950 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
22960 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 52  the first nSkipR
22970 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e 73 74  ange range const
22980 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74 68 65  raints since the
22990 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
229a0 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
229b0 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20  y accounted for 
229c0 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  these */.       
229d0 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67 65 2d       nSkipRange-
229e0 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  -;.          }el
229f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22a00 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20 61  /* Assume each a
22a10 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65 20  dditional range 
22a20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
22a30 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  es the result.  
22a40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
22a50 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f   size by a facto
22a60 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78 65 64  r of 3.  Indexed
22a70 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
22a80 74 73 20 72 65 64 75 63 65 0a 20 20 20 20 20 20  ts reduce.      
22a90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61        ** the sea
22aa0 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 6c  rch space by a l
22ab0 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20 34 2e  arger factor: 4.
22ac0 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65 78 65    We make indexe
22ad0 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  d range.        
22ae0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c 65      ** more sele
22af0 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e 61  ctive intentiona
22b00 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66 20 74  lly because of t
22b10 68 65 20 73 75 62 6a 65 63 74 69 76 65 20 0a 20  he subjective . 
22b20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62             ** ob
22b30 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74 20 69  servation that i
22b40 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e  ndexed range con
22b50 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c 79 20  straints really 
22b60 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20 20 20  are more.       
22b70 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 69 76       ** selectiv
22b80 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 6f  e in practice, o
22b90 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20 20  n average. */.  
22ba0 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61            pc.pla
22bb0 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20  n.nRow /= 3;.   
22bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22bd0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
22be0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
22bf0 4f 5f 4e 4f 4f 50 29 3d 3d 30 20 29 7b 0a 20 20  O_NOOP)==0 ){.  
22c00 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f          /* Any o
22c10 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
22c20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74 70 75  lowers the outpu
22c30 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68  t row count by h
22c40 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  alf */.         
22c50 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d   pc.plan.nRow /=
22c60 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
22c70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22c80 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32 20 29  pc.plan.nRow<2 )
22c90 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20   pc.plan.nRow = 
22ca0 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  2;.    }...    /
22cb0 2a 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20  *WHERETRACE((.  
22cc0 20 20 20 20 22 20 20 20 20 20 20 6e 45 71 3d 25      "      nEq=%
22cd0 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67  d nInMul=%d rang
22ce0 65 44 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64  eDiv=%d bSort=%d
22cf0 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c   bLookup=%d wsFl
22d00 61 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a 20 20  ags=0x%08x\n".  
22d10 20 20 20 20 22 20 20 20 20 20 20 6e 6f 74 52 65      "      notRe
22d20 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30  ady=0x%llx log10
22d30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66  N=%.1f nRow=%.1f
22d40 20 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20   cost=%.1f\n".  
22d50 20 20 20 20 22 20 20 20 20 20 20 75 73 65 64 3d      "      used=
22d60 30 78 25 6c 6c 78 20 6e 4f 42 53 61 74 3d 25 64  0x%llx nOBSat=%d
22d70 5c 6e 22 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c  \n",.      pc.pl
22d80 61 6e 2e 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20  an.nEq, nInMul, 
22d90 28 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62  (int)rangeDiv, b
22da0 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70  Sort, bLookup, p
22db0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 0a  c.plan.wsFlags,.
22dc0 20 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65 61 64        p->notRead
22dd0 79 2c 20 6c 6f 67 31 30 4e 2c 20 70 63 2e 70 6c  y, log10N, pc.pl
22de0 61 6e 2e 6e 52 6f 77 2c 20 70 63 2e 72 43 6f 73  an.nRow, pc.rCos
22df0 74 2c 20 70 63 2e 75 73 65 64 2c 0a 20 20 20 20  t, pc.used,.    
22e00 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74    pc.plan.nOBSat
22e10 0a 20 20 20 20 29 29 3b 2a 2f 0a 0a 20 20 20 20  .    ));*/..    
22e20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
22e30 20 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20   is the best we 
22e40 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72  have seen so far
22e50 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  , then record th
22e60 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  is.    ** index 
22e70 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20  and its cost in 
22e80 74 68 65 20 70 2d 3e 63 6f 73 74 20 73 74 72 75  the p->cost stru
22e90 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
22ea0 20 20 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20    if( (!pIdx || 
22eb0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29  pc.plan.wsFlags)
22ec0 20 26 26 20 63 6f 6d 70 61 72 65 43 6f 73 74 28   && compareCost(
22ed0 26 70 63 2c 20 26 70 2d 3e 63 6f 73 74 29 20 29  &pc, &p->cost) )
22ee0 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 20  {.      p->cost 
22ef0 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 63  = pc;.      p->c
22f00 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
22f10 20 26 3d 20 77 73 46 6c 61 67 4d 61 73 6b 3b 0a   &= wsFlagMask;.
22f20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
22f30 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78  an.u.pIdx = pIdx
22f40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22f50 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
22f60 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
22f70 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61  e, then only tha
22f80 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20  t one index is. 
22f90 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
22fa0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72  . */.    if( pSr
22fb0 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61  c->pIndex ) brea
22fc0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74  k;..    /* Reset
22fd0 20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e   masks for the n
22fe0 65 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ext index in the
22ff0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46   loop */.    wsF
23000 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52  lagMask = ~(WHER
23010 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
23020 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
23030 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
23040 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20  idxEqTermMask;. 
23050 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
23060 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
23070 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
23080 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
23090 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  der flag.  ** is
230a0 20 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72   set, then rever
230b0 73 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61  se the order tha
230c0 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  t the index will
230d0 20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a   be scanned.  **
230e0 20 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65   in. This is use
230f0 64 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f  d for applicatio
23100 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65  n testing, to he
23110 6c 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20  lp find cases.  
23120 2a 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61  ** where applica
23130 74 69 6f 6e 20 62 65 68 61 76 69 6f 72 20 64 65  tion behavior de
23140 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e  pends on the (un
23150 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74  defined) order t
23160 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hat.  ** SQLite 
23170 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
23180 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  in the absence o
23190 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  f an ORDER BY cl
231a0 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
231b0 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20  !p->pOrderBy && 
231c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
231d0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
231e0 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70  seOrder ){.    p
231f0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
23200 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
23210 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ERSE;.  }..  ass
23220 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
23230 20 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61   || (p->cost.pla
23240 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
23250 4f 52 44 45 52 45 44 29 3d 3d 30 20 29 3b 0a 20  ORDERED)==0 );. 
23260 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6f 73 74   assert( p->cost
23270 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  .plan.u.pIdx==0 
23280 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  || (p->cost.plan
23290 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52  .wsFlags&WHERE_R
232a0 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20  OWID_EQ)==0 );. 
232b0 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70   assert( pSrc->p
232c0 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20  Index==0 .      
232d0 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   || p->cost.plan
232e0 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20  .u.pIdx==0 .    
232f0 20 20 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c     || p->cost.pl
23300 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d  an.u.pIdx==pSrc-
23310 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20  >pIndex .  );.. 
23320 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
23330 20 20 20 62 65 73 74 20 69 6e 64 65 78 20 69 73     best index is
23340 20 25 73 20 63 6f 73 74 3d 25 2e 31 66 5c 6e 22   %s cost=%.1f\n"
23350 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  ,.         p->co
23360 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f  st.plan.u.pIdx ?
23370 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
23380 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69  pIdx->zName : "i
23390 70 6b 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  pk",.         p-
233a0 3e 63 6f 73 74 2e 72 43 6f 73 74 29 29 3b 2a 2f  >cost.rCost));*/
233b0 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75  .  .  bestOrClau
233c0 73 65 49 6e 64 65 78 28 70 29 3b 0a 20 20 62 65  seIndex(p);.  be
233d0 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
233e0 28 70 29 3b 0a 20 20 69 66 28 20 65 71 54 65 72  (p);.  if( eqTer
233f0 6d 4d 61 73 6b 20 26 20 57 4f 5f 49 53 4e 55 4c  mMask & WO_ISNUL
23400 4c 20 29 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  L ) p->cost.plan
23410 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
23420 45 5f 4e 55 4c 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  E_NULL_OK;.}../*
23430 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
23440 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
23450 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
23460 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
23470 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
23480 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
23490 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
234a0 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
234b0 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
234c0 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
234d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
234e0 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
234f0 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
23500 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
23510 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2a   table scans..**
23520 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23530 6e 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  n does not take 
23540 4f 52 44 45 52 20 42 59 20 6f 72 20 44 49 53 54  ORDER BY or DIST
23550 49 4e 43 54 20 69 6e 74 6f 20 61 63 63 6f 75 6e  INCT into accoun
23560 74 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  t.  Nor.** does 
23570 69 74 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20  it remember the 
23580 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75  virtual table qu
23590 65 72 79 20 70 6c 61 6e 2e 20 20 41 6c 6c 20 69  ery plan.  All i
235a0 74 20 64 6f 65 73 20 69 73 20 63 6f 6d 70 75 74  t does is comput
235b0 65 0a 2a 2a 20 74 68 65 20 63 6f 73 74 20 77 68  e.** the cost wh
235c0 69 6c 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ile determining 
235d0 69 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  if an OR optimiz
235e0 61 74 69 6f 6e 20 69 73 20 61 70 70 6c 69 63 61  ation is applica
235f0 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 64 65 74  ble.  The.** det
23600 61 69 6c 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ails will be rec
23610 6f 6e 73 69 64 65 72 65 64 20 6c 61 74 65 72 20  onsidered later 
23620 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
23630 69 6f 6e 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ion is found to 
23640 62 65 0a 2a 2a 20 61 70 70 6c 69 63 61 62 6c 65  be.** applicable
23650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23660 20 62 65 73 74 49 6e 64 65 78 28 57 68 65 72 65   bestIndex(Where
23670 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69 66  BestIdx *p){.#if
23680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23690 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
236a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 2d  if( IsVirtual(p-
236b0 3e 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a  >pSrc->pTab) ){.
236c0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
236d0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
236e0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 70 49   = 0;.    p->ppI
236f0 64 78 49 6e 66 6f 20 3d 20 26 70 49 64 78 49 6e  dxInfo = &pIdxIn
23700 66 6f 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74  fo;.    bestVirt
23710 75 61 6c 49 6e 64 65 78 28 70 29 3b 0a 20 20 20  ualIndex(p);.   
23720 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66   assert( pIdxInf
23730 6f 21 3d 30 20 7c 7c 20 70 2d 3e 70 50 61 72 73  o!=0 || p->pPars
23740 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
23750 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 70  led );.    if( p
23760 49 64 78 49 6e 66 6f 20 26 26 20 70 49 64 78 49  IdxInfo && pIdxI
23770 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
23780 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73  dxStr ){.      s
23790 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
237a0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
237b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
237c0 44 62 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65  DbFree(p->pParse
237d0 2d 3e 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  ->db, pIdxInfo);
237e0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
237f0 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65    {.    bestBtre
23800 65 49 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d  eIndex(p);.  }.}
23810 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
23820 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
23830 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
23840 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
23850 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
23860 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
23870 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
23880 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
23890 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
238a0 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
238b0 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
238c0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
238d0 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
238e0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
238f0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
23900 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
23910 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
23920 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
23930 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
23940 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
23950 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
23960 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
23970 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
23980 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
23990 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
239a0 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
239b0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
239c0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
239d0 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
239e0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
239f0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
23a00 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
23a10 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
23a20 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
23a30 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
23a40 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
23a50 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
23a60 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
23a70 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
23a80 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
23a90 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
23aa0 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35  TATION-OF: R-245
23ab0 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74  97-58655 No test
23ac0 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74  s are done for t
23ad0 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a  erms that are.**
23ae0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69   completely sati
23af0 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73  sfied by indices
23b00 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
23b10 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
23b20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
23b30 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
23b40 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
23b50 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
23b60 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
23b70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
23b80 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
23b90 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
23ba0 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
23bb0 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
23bc0 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
23bd0 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
23be0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
23bf0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
23c00 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
23c10 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
23c20 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
23c30 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
23c40 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
23c50 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
23c60 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
23c70 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
23c80 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
23c90 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
23ca0 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
23cb0 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
23cc0 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
23cd0 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
23ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23cf0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
23d00 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
23d10 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
23d20 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
23d30 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
23d40 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
23d50 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
23d60 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
23d70 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
23d80 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
23d90 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
23da0 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
23db0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
23dc0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
23dd0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
23de0 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
23df0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
23e00 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
23e10 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
23e20 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
23e30 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
23e40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23e50 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
23e60 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
23e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
23e80 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
23e90 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
23ea0 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
23eb0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
23ec0 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
23ed0 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
23ee0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
23ef0 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
23f00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
23f10 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
23f20 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
23f30 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
23f40 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
23f50 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
23f60 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
23f70 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
23f80 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
23f90 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
23fa0 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
23fb0 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
23fc0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
23fd0 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
23fe0 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
23ff0 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
24000 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
24010 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
24020 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
24030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
24040 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
24050 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24060 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
24070 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
24080 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
24090 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
240a0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
240b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
240c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
240d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
240e0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
240f0 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
24100 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
24110 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
24120 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
24130 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
24140 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
24150 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
24160 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
24170 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
24180 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
24190 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
241a0 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
241b0 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
241c0 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
241d0 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
241e0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
241f0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
24200 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
24210 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
24220 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
24230 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
24240 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
24250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24260 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
24270 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
24280 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
24290 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
242a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
242b0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
242c0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
242d0 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
242e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
242f0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
24300 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
24310 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
24320 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
24330 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
24340 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
24350 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
24360 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
24370 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
24380 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
24390 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
243a0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
243b0 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
243c0 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
243d0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
243e0 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
243f0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
24400 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
24410 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
24420 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
24430 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
24440 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
24450 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
24460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
24470 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
24480 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
24490 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
244a0 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
244b0 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
244c0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
244d0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
244e0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
244f0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
24500 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
24510 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
24520 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
24530 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
24540 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
24550 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
24560 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24570 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
24580 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
24590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
245a0 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
245b0 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
245c0 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
245d0 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
245e0 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
245f0 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
24600 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
24610 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
24620 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
24630 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
24640 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24650 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
24660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
24670 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
24680 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
24690 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
246a0 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
246b0 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
246c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
246d0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
246e0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
246f0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
24700 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
24710 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
24720 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
24730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24740 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
24750 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
24760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24770 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
24780 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
24790 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
247a0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
247b0 6e 3b 0a 20 20 20 20 75 38 20 62 52 65 76 20 3d  n;.    u8 bRev =
247c0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
247d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
247e0 45 56 45 52 53 45 29 21 3d 30 3b 0a 0a 20 20 20  EVERSE)!=0;..   
247f0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
24800 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
24810 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 0a  RE_INDEXED)!=0 .
24820 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d        && pLevel-
24830 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 61 53  >plan.u.pIdx->aS
24840 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
24850 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
24860 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
24870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
24880 45 71 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  Eq==pLevel->plan
24890 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .u.pIdx->nColumn
248a0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
248b0 63 61 73 65 28 20 69 45 71 3e 30 20 26 26 20 69  case( iEq>0 && i
248c0 45 71 2b 31 3c 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq+1<pLevel->pla
248d0 6e 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n.u.pIdx->nColum
248e0 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  n );.      testc
248f0 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
24900 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
24910 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24920 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
24930 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
24940 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
24950 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
24960 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
24970 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
24980 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
24990 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
249a0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
249b0 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
249c0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
249d0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
249e0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
249f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
24a00 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
24a10 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
24a20 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
24a30 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
24a40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
24a50 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
24a60 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
24a70 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
24a80 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
24a90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
24aa0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
24ab0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
24ac0 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
24ad0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
24ae0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
24af0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
24b00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
24b10 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
24b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
24b50 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
24b60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
24b70 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
24b80 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
24b90 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
24ba0 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
24bb0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
24bc0 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
24bd0 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
24be0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
24bf0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
24c00 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
24c10 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
24c20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24c30 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
24c40 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
24c50 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
24c60 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
24c70 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
24c80 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
24c90 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
24ca0 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
24cb0 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
24cc0 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
24cd0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
24ce0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
24cf0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
24d00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24d10 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
24d20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
24d30 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
24d40 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
24d50 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
24d60 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
24d70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
24d80 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
24d90 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
24da0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
24db0 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
24dc0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
24dd0 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
24de0 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
24df0 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
24e00 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
24e10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24e20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
24e30 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
24e40 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
24e50 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
24e60 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
24e70 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
24e80 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
24e90 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
24ea0 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
24eb0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
24ec0 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
24ed0 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
24ee0 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
24ef0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
24f00 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
24f10 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
24f20 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
24f30 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
24f40 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
24f50 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
24f60 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
24f70 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
24f80 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
24f90 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
24fa0 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
24fb0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
24fc0 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
24fd0 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
24fe0 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
24ff0 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
25000 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
25010 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
25020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25030 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
25040 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
25050 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
25060 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
25070 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
25080 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
25090 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
250a0 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
250b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
250c0 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
250d0 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
250e0 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
250f0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
25100 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
25110 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
25120 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
25130 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
25140 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
25150 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
25160 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
25170 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
25180 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
25190 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
251a0 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
251b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
251c0 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
251d0 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
251e0 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
251f0 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a  nal.** use..**.*
25200 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
25210 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65  ng, *pzAff is se
25220 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
25230 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
25240 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74  g a.** copy of t
25250 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
25260 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65  ty string of the
25270 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64   index allocated
25280 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
25290 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63  3DbMalloc(). Exc
252a0 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20  ept, entries in 
252b0 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
252c0 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65  string associate
252d0 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69  d.** with equali
252e0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ty constraints t
252f0 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66  hat use NONE aff
25300 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f  inity are set to
25310 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
25320 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ONE. This is to 
25330 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75  deal with SQL su
25340 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
25350 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
25360 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54  ATE TABLE t1(a T
25370 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
25380 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   b);.**   SELECT
25390 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20   ... FROM t1 AS 
253a0 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e  t2, t1 WHERE t1.
253b0 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20  a = t2.b;.**.** 
253c0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
253d0 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20  bove, the index 
253e0 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58  on t1(a) has TEX
253f0 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20  T affinity. But 
25400 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67  since.** the rig
25410 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht hand side of 
25420 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
25430 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68  straint (t2.b) h
25440 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  as NONE affinity
25450 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69  ,.** no conversi
25460 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74  on should be att
25470 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73  empted before us
25480 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65  ing a t2.b value
25490 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61   as part of.** a
254a0 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74   key to search t
254b0 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20  he index. Hence 
254c0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  the first byte i
254d0 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
254e0 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e  ffinity.** strin
254f0 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c  g in this exampl
25500 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74  e would be set t
25510 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  o SQLITE_AFF_NON
25520 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
25530 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
25540 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
25550 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
25560 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25570 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
25580 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
25590 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
255a0 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
255b0 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
255c0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
255d0 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
255e0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
255f0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
25600 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70  ,     /* Which p
25610 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76  arts of FROM hav
25620 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
25630 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  oded */.  int nE
25640 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
25650 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
25660 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
25670 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
25680 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
25690 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
256a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
256b0 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
256c0 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
256d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
256e0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
256f0 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
25700 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
25710 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
25720 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
25730 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
25740 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
25750 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
25760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25770 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
25780 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
25790 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
257a0 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
257b0 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
257c0 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
257d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
257e0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
257f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
25800 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
25810 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
25820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25830 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25840 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
25850 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
25860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
25870 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
25880 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
258b0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
258c0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
258d0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
258e0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
258f0 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
25900 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 71 46 6c  rn */.  int eqFl
25910 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
25920 20 20 20 20 20 20 2f 2a 20 57 4f 5f 45 51 7c 57        /* WO_EQ|W
25930 4f 5f 49 4e 20 61 6e 64 20 6d 61 79 62 65 20 61  O_IN and maybe a
25940 6c 73 6f 20 57 4f 5f 49 53 4e 55 4c 4c 20 2a 2f  lso WO_ISNULL */
25950 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
25960 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
25970 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
25980 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
25990 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ex. */.  assert(
259a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
259b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
259c0 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20  DEXED );.  pIdx 
259d0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
259e0 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  .pIdx;..  /* Fig
259f0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
25a00 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
25a10 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
25a20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
25a30 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
25a40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
25a50 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65  ;.  nReg = pLeve
25a60 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45  l->plan.nEq + nE
25a70 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
25a80 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
25a90 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
25aa0 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
25ab0 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
25ac0 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
25ad0 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
25ae0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
25af0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
25b00 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
25b10 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
25b20 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
25b30 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
25b40 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
25b50 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 65 71  umn>=nEq );.  eq
25b60 46 6c 61 67 73 20 3d 20 28 70 4c 65 76 65 6c 2d  Flags = (pLevel-
25b70 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
25b80 45 52 45 5f 4e 55 4c 4c 5f 4f 4b 29 20 3f 20 28  ERE_NULL_OK) ? (
25b90 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
25ba0 53 4e 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20  SNULL).         
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 20 20 20 20 20 20 20 20 3a 20 28 57 4f 5f 45 51          : (WO_EQ
25be0 7c 57 4f 5f 49 4e 29 3b 0a 20 20 66 6f 72 28 6a  |WO_IN);.  for(j
25bf0 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
25c00 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
25c10 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
25c20 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
25c30 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
25c40 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
25c50 6f 74 52 65 61 64 79 2c 20 65 71 46 6c 61 67 73  otReady, eqFlags
25c60 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
25c70 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
25c80 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  k;.    /* The fo
25c90 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72  llowing true for
25ca0 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
25cb0 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
25cc0 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
25cd0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
25ce0 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
25cf0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
25d00 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
25d10 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
25d20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
25d30 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
25d40 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
25d50 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
25d60 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
25d70 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
25d80 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72  5-11662 */.    r
25d90 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
25da0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
25db0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 72  rm, pLevel, j, r
25dc0 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69  egBase+j);.    i
25dd0 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a  f( r1!=regBase+j
25de0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
25df0 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  eg==1 ){.       
25e00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25e10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
25e20 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
25e30 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20   regBase = r1;. 
25e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
25e70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
25e80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25e90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
25ea0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
25eb0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
25ec0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
25ed0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
25ee0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28  WO_IN );.    if(
25ef0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
25f00 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
25f10 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
25f20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
25f30 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
25f40 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
25f50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
25f60 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
25f70 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70  ht, regBase+j, p
25f80 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
25f90 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
25fa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
25fb0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
25fc0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
25fd0 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
25fe0 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
25ff0 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
26000 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
26010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26020 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
26030 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
26040 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
26050 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
26060 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
26070 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
26080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
260a0 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
260b0 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
260c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
260d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
260e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
260f0 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
26100 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
26110 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
26120 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
26130 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
26140 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
26150 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
26160 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
26170 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
26180 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
26190 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
261a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
261b0 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
261c0 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
261d0 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
261e0 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
261f0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
26200 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
26210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
26220 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
26230 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
26240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26250 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
26260 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
26270 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
262a0 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
262b0 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
262c0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
262d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
262e0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
262f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26300 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
26310 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
26320 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
26330 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
26340 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
26350 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
26360 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
26370 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
26380 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b  r, zColumn, -1);
26390 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
263a0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
263b0 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  Op, 1);.  sqlite
263c0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
263d0 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d  pStr, "?", 1);.}
263e0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
263f0 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65   pLevel describe
26400 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72  s a strategy for
26410 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20   scanning table 
26420 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66  pTab. This .** f
26430 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
26440 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
26450 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e  tring buffer con
26460 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69  taining a descri
26470 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ption.** of the 
26480 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20  subset of table 
26490 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
264a0 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20  the strategy in 
264b0 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a  the form of an.*
264c0 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
264d0 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77  . Or, if all row
264e0 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e  s are scanned, N
264f0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
26500 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
26510 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
26520 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
26530 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
26540 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a   a=1 AND b>2;.**
26550 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74  .** is run and t
26560 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
26570 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e   on (a, b), then
26580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26590 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69  eturns a.** stri
265a0 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ng similar to:.*
265b0 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20  *.**   "a=? AND 
265c0 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  b>?".**.** The r
265d0 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
265e0 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79  points to memory
265f0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
26600 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
26610 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
26620 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
26630 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
26640 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77  ree the buffer w
26650 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20  hen it is.** no 
26660 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
26670 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
26680 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e  *explainIndexRan
26690 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ge(sqlite3 *db, 
266a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
266b0 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  el, Table *pTab)
266c0 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70  {.  WherePlan *p
266d0 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e  Plan = &pLevel->
266e0 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70  plan;.  Index *p
266f0 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75  Index = pPlan->u
26700 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71  .pIdx;.  int nEq
26710 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20   = pPlan->nEq;. 
26720 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
26730 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
26740 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61  ->aCol;.  int *a
26750 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
26760 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
26770 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
26780 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 50  f( nEq==0 && (pP
26790 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  lan->wsFlags & (
267a0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
267b0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
267c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
267d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
267e0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
267f0 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49  &txt, 0, 0, SQLI
26800 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
26810 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20    txt.db = db;. 
26820 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
26830 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28  Append(&txt, " (
26840 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 2);.  for(i=0
26850 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<nEq; i++){. 
26860 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
26870 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43  Term(&txt, i, aC
26880 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  ol[aiColumn[i]].
26890 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d  zName, "=");.  }
268a0 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
268b0 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26   pPlan->wsFlags&
268c0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
268d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
268e0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
268f0 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
26900 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
26910 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
26920 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
26930 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
26940 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
26950 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
26960 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
26970 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
26980 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
26990 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
269a0 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
269b0 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
269c0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
269d0 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
269e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
269f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
26a00 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
26a10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
26a20 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
26a30 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
26a40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26a50 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
26a60 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
26a70 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
26a80 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
26a90 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
26aa0 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
26ab0 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
26ac0 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
26ad0 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
26ae0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
26af0 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
26b00 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
26b10 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
26b20 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
26b30 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
26b40 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
26b50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
26b60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
26b70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
26b80 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ba0 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
26bb0 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
26bc0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
26bd0 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
26be0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
26bf0 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
26c00 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
26c10 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c30 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
26c40 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
26c50 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
26c60 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
26c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
26c80 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
26c90 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
26ca0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
26cb0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
26cc0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
26cd0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
26ce0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
26cf0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
26d00 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
26d10 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d 20 70     u32 flags = p
26d20 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
26d30 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ags;.    struct 
26d40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
26d50 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
26d60 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
26d70 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
26d80 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
26d90 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
26da0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
26db0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
26dc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
26dd0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
26de0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  ndle */.    char
26df0 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20   *zMsg;         
26e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
26e10 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20  t to add to EQP 
26e20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71  output */.    sq
26e30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77  lite3_int64 nRow
26e40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ;           /* E
26e50 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
26e60 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
26e70 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e  y scan */.    in
26e80 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
26e90 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
26ea0 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
26eb0 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
26ec0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
26ed0 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
26ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26ef0 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
26f00 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
26f10 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ..    if( (flags
26f20 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
26f30 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
26f40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
26f50 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
26f60 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
26f70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
26f80 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  >0).            
26f90 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48 45 52   || (flags&(WHER
26fa0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
26fb0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
26fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
26fd0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
26fe0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
26ff0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
27000 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
27010 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
27020 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
27030 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
27040 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
27050 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
27060 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
27070 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
27080 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
27090 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
270a0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
270b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
270c0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
270d0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
270e0 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
270f0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
27100 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
27110 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
27120 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
27130 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27140 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
27150 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
27160 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
27170 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
27180 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
27190 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
271a0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
271b0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
271c0 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49  e(db, pLevel, pI
271d0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
271e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
271f0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
27200 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25 73 25  g, "%s USING %s%
27210 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a  sINDEX%s%s%s", z
27220 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
27230 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
27240 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54  TEMP_INDEX)?"AUT
27250 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20  OMATIC ":""),.  
27260 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
27270 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
27280 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22  )?"COVERING ":""
27290 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
272a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
272b0 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29  P_INDEX)?"":" ")
272c0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
272d0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
272e0 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65 76  _INDEX)?"": pLev
272f0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
27300 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
27310 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20     zWhere.      
27320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27330 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72  DbFree(db, zWher
27340 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
27350 28 20 66 6c 61 67 73 20 26 20 28 57 48 45 52 45  ( flags & (WHERE
27360 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
27370 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
27380 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
27390 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
273a0 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
273b0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
273c0 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20   KEY", zMsg);.. 
273d0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 57       if( flags&W
273e0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
273f0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
27400 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
27410 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
27420 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid=?)", zMsg);
27430 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27440 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
27450 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
27460 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
27470 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
27480 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
27490 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
274a0 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
274b0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
274c0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
274d0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
274e0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
274f0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27500 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
27510 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
27520 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
27530 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
27540 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
27550 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
27560 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
27570 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
27580 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
27590 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
275a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
275b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
275c0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
275d0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
275e0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
275f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
27600 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
27610 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
27620 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20  pVtabIdx;.      
27630 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
27640 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
27650 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
27660 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
27670 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
27680 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
27690 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62  x->idxNum, pVtab
276a0 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
276b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
276c0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57  f( wctrlFlags&(W
276d0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
276e0 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
276f0 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  AX) ){.      tes
27700 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
27710 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
27720 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e  Y_MIN );.      n
27730 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Row = 1;.    }el
27740 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d  se{.      nRow =
27750 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
27760 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f  pLevel->plan.nRo
27770 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73  w;.    }.    zMs
27780 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
27790 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
277a0 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c  s (~%lld rows)",
277b0 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20   zMsg, nRow);.  
277c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
277d0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
277e0 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
277f0 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
27800 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
27810 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
27820 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
27830 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
27840 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
27850 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
27860 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
27870 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
27880 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
27890 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
278a0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
278b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
278c0 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
278d0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
278e0 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
278f0 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
27900 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
27910 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
27920 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
27930 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
27940 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
27950 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
27960 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
27970 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
27980 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ed */.  u16 wctr
27990 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20  lFlags,      /* 
279a0 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
279b0 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
279c0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
279d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
279e0 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
279f0 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
27a00 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
27a10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
27a20 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
27a30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
27a40 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
27a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27a60 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
27a70 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
27a80 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
27a90 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
27aa0 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
27ab0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
27ac0 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
27ad0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
27ae0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
27af0 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
27b00 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
27b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
27b20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
27b30 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
27b40 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
27b50 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
27b60 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
27b70 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
27b80 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
27b90 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
27ba0 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
27bb0 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
27bc0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
27bd0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27bf0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
27c00 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
27c10 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
27c20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
27c30 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
27c40 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
27c70 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
27c80 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
27c90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27ca0 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
27cb0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
27cc0 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
27cd0 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
27d00 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
27d10 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
27d20 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d40 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
27d50 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
27d60 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
27d70 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
27d80 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
27d90 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
27da0 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
27db0 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
27dc0 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
27dd0 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
27de0 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
27df0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27e00 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 65   */.  Bitmask ne
27e10 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  wNotReady;      
27e20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
27e30 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
27e40 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
27e50 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
27e60 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e  be;.  pWC = pWIn
27e70 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65  fo->pWC;.  pLeve
27e80 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
27e90 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74  Level];.  pTabIt
27ea0 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
27eb0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
27ec0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
27ed0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
27ee0 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28  rsor;.  bRev = (
27ef0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27f00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
27f10 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74  ERSE)!=0;.  omit
27f20 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d  Table = (pLevel-
27f30 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
27f40 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
27f50 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
27f60 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
27f70 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
27f80 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f  E)==0;.  VdbeNoo
27f90 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
27fa0 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64  gin Join Loop %d
27fb0 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20  ", iLevel));..  
27fc0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
27fd0 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
27fe0 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
27ff0 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
28000 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
28010 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
28020 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
28030 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
28040 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
28050 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
28060 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
28070 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
28080 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
28090 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
280a0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
280b0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
280c0 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
280d0 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
280e0 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
280f0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
28100 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
28110 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
28120 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
28130 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
28140 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
28150 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
28160 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
28170 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
28180 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
28190 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
281a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
281b0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
281c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
281d0 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
281e0 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
281f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28200 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
28210 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
28220 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
28230 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
28240 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
28250 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
28260 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
28270 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
28280 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
28290 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
282a0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
282b0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
282c0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
282d0 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
282e0 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
282f0 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
28300 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
28310 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
28320 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
28330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28340 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
28350 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
28360 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
28370 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
28380 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
28390 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
283a0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
283b0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
283c0 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
283d0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
283e0 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
283f0 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
28400 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
28410 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
28420 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
28430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28440 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
28450 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64  er, pTabItem->ad
28460 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67  drFillSub-1, reg
28470 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76  Yield);.    pLev
28480 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
28490 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
284a0 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
284b0 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  d);.    VdbeComm
284c0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f  ent((v, "next ro
284d0 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20  w of co-routine 
284e0 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  %s", pTabItem->p
284f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
28500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28510 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
28520 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72  gYield+1, addrBr
28530 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
28540 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
28550 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
28560 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28570 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
28580 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28590 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
285a0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
285b0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20  .    /* Case 0: 
285c0 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
285d0 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
285e0 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
285f0 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a  and VNext.    **
28600 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
28610 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
28620 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65    */.    int iRe
28630 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65  g;   /* P3 Value
28640 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20   for OP_VFilter 
28650 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  */.    int addrN
28660 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 73 71 6c  otFound;.    sql
28670 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
28680 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
28690 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
286a0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
286b0 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
286c0 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
286d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
286e0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
286f0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
28700 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28730 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
28740 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
28750 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
28760 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
28770 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
28780 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
287c0 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
287d0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
287e0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
287f0 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
28800 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
28810 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
28820 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
28830 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
28840 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
28850 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
28860 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
28870 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  ){.      for(k=0
28880 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; k<nConstraint;
28890 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
288a0 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67  f( aUsage[k].arg
288b0 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20  vIndex==j ){.   
288c0 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67         int iTarg
288d0 65 74 20 3d 20 69 52 65 67 2b 6a 2b 31 3b 0a 20  et = iReg+j+1;. 
288e0 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d           pTerm =
288f0 20 26 70 57 43 2d 3e 61 5b 61 43 6f 6e 73 74 72   &pWC->a[aConstr
28900 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66  aint[k].iTermOff
28910 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  set];.          
28920 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28930 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
28940 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 64 65              code
28950 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
28960 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
28970 65 6c 2c 20 6b 2c 20 69 54 61 72 67 65 74 29 3b  el, k, iTarget);
28980 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
28990 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
289a0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
289b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
289c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
289d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
289e0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
289f0 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
28a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28a10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28a30 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43  .      if( k==nC
28a40 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
28a50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
28a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28a70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56  , OP_Integer, pV
28a80 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
28a90 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
28aa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28ab0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c  OP_Integer, j-1,
28ac0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
28ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28ae0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
28af0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
28b00 64 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  d, iReg, pVtabId
28b10 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
28b40 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
28b50 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
28b60 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
28b70 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
28b80 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
28b90 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
28ba0 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
28bb0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
28bc0 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
28bd0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
28be0 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
28bf0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
28c00 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
28c10 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
28c20 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
28c30 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
28c40 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
28c50 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
28c60 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
28c70 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
28c80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
28ca0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
28cb0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
28cc0 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
28cd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28ce0 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
28cf0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
28d00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
28d10 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
28d20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
28d30 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
28d40 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
28d50 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65    /* Case 1:  We
28d60 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
28d70 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
28d80 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
28d90 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
28da0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
28db0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
28dc0 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
28dd0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
28de0 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
28df0 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
28e00 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
28e10 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
28e20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
28e30 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73    */.    iReleas
28e40 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
28e50 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
28e60 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
28e70 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
28e80 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
28e90 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
28ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
28eb0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
28ec0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
28ed0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
28ee0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
28ef0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28f00 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
28f10 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
28f20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
28f30 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69  5-11662 */.    i
28f40 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
28f50 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
28f60 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
28f70 6c 2c 20 30 2c 20 69 52 65 6c 65 61 73 65 52 65  l, 0, iReleaseRe
28f80 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
28f90 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
28fa0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
28fb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
28fc0 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
28fd0 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  Reg, addrNxt);. 
28fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28ff0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
29000 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
29010 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
29020 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29030 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
29040 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77  nge(pParse, iRow
29050 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73  idReg, 1);.    s
29060 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
29070 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
29080 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
29090 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
290a0 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
290b0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
290c0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
290d0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
290e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
290f0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
29100 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
29110 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
29120 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
29130 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
29140 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
29150 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
29160 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
29170 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
29180 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
29190 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
291a0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
291b0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
291c0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
291d0 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
291e0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
291f0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
29200 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
29210 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
29220 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
29230 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
29240 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
29250 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
29260 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
29270 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
29280 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
29290 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
292a0 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
292b0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
292c0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
292d0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
292e0 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
292f0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
29300 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
29310 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
29320 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
29330 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
29340 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
29350 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
29360 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
29370 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
29380 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
29390 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
293a0 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
293b0 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
293c0 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
293d0 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
293e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
293f0 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
29400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
29410 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
29420 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
29430 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
29440 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
29450 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
29460 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
29470 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
29480 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
29490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
294a0 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
294b0 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
294c0 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
294d0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
294e0 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
294f0 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
29500 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
29510 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
29520 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
29530 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
29540 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
29550 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
29560 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
29570 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
29580 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
29590 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
295a0 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20  2 */.      pX = 
295b0 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
295c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
295d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
295e0 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
295f0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
29600 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
29610 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
29620 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
29630 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
29640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29650 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
29660 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
29670 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
29680 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
29690 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
296a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
296b0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
296c0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
296d0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
296e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
296f0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
29700 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
29710 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
29720 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
29730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29740 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
29750 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
29760 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
29770 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
29780 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
29790 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
297a0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
297b0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
297c0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
297d0 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
297e0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
297f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
29800 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
29810 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
29820 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
29830 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
29840 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
29850 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
29860 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29870 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
29880 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
29890 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
298a0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
298b0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
298c0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
298d0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
298e0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
298f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
29900 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
29910 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
29920 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
29930 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
29940 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
29950 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
29960 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29970 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
29980 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
29990 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
299a0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
299b0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
299c0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
299d0 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20    if( pStart==0 
299e0 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20  && pEnd==0 ){.  
299f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
29a00 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
29a10 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
29a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29a30 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
29a40 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
29a50 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  }.    if( testOp
29a60 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
29a70 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
29a80 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
29a90 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
29aa0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
29ab0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29ac0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
29ad0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
29ae0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29af0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
29b00 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
29b10 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
29b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29b30 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
29b40 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
29b50 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
29b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
29b70 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
29b80 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
29b90 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
29ba0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
29bb0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
29bc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
29bd0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
29be0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
29bf0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
29c00 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   3: A scan using
29c10 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
29c20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
29c30 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
29c40 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
29c50 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
29c60 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
29c70 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
29c80 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
29c90 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
29ca0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
29cb0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
29cc0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
29cd0 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
29ce0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
29cf0 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
29d00 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
29d10 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
29d20 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
29d30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
29d40 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
29d50 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
29d60 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
29d70 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
29d80 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
29d90 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
29da0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
29db0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
29dc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
29dd0 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
29de0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
29df0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
29e00 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
29e10 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
29e20 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
29e30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
29e40 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
29e50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
29e60 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
29e70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
29e80 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
29e90 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
29ea0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
29eb0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
29ec0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
29ed0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
29ee0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
29f00 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
29f10 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
29f20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
29f30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
29f40 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
29f50 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
29f60 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
29f70 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
29f80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
29f90 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
29fa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
29fb0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
29fc0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
29fd0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
29fe0 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
29ff0 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
2a000 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
2a010 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
2a020 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
2a030 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
2a040 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
2a050 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
2a060 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
2a070 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
2a080 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
2a090 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
2a0a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
2a0b0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
2a0c0 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
2a0d0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
2a0e0 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
2a0f0 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
2a100 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
2a110 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
2a120 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
2a130 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
2a140 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
2a150 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
2a160 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
2a170 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
2a180 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
2a190 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
2a1a0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
2a1b0 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
2a1c0 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
2a1d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
2a1e0 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
2a1f0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
2a200 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
2a210 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
2a220 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
2a230 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
2a240 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
2a250 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
2a260 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
2a270 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
2a280 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
2a290 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
2a2a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
2a2b0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
2a2c0 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
2a2d0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
2a2e0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
2a2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
2a300 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
2a310 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
2a320 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
2a330 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
2a340 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
2a350 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
2a360 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2a370 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
2a380 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
2a390 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
2a3a0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
2a3b0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
2a3c0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
2a3d0 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
2a3e0 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
2a3f0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
2a400 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
2a410 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
2a420 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
2a430 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
2a440 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
2a450 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
2a460 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
2a470 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2a480 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
2a490 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
2a4a0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4c0 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
2a4d0 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
2a4e0 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
2a4f0 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a510 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
2a520 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
2a530 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
2a540 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
2a550 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
2a560 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
2a570 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
2a580 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
2a590 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
2a5a0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
2a5b0 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
2a5c0 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
2a5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a5e0 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
2a5f0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
2a600 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
2a610 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
2a620 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a630 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
2a640 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
2a650 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
2a660 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
2a670 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
2a680 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
2a690 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
2a6a0 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
2a6b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a6c0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
2a6d0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
2a6e0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
2a6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a700 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
2a710 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
2a720 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
2a730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a740 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
2a750 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
2a760 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
2a770 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2a790 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
2a7a0 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
2a7b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2a7c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
2a7d0 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
2a7e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
2a7f0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
2a800 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
2a810 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
2a820 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
2a830 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
2a840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a850 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
2a860 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
2a870 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
2a880 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
2a890 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
2a8a0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
2a8b0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
2a8c0 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e   = (nEq==pIdx->n
2a8d0 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49  Column ? -1 : pI
2a8e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
2a8f0 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
2a900 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
2a910 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
2a920 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
2a930 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
2a940 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
2a950 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
2a960 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
2a970 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
2a980 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
2a990 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
2a9a0 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
2a9b0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
2a9c0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
2a9d0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
2a9e0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
2a9f0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
2aa00 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
2aa10 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
2aa20 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
2aa30 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
2aa40 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
2aa50 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
2aa60 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
2aa70 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
2aa80 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
2aa90 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
2aaa0 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
2aab0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
2aac0 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
2aad0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
2aae0 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
2aaf0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
2ab00 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
2ab10 52 44 45 52 45 44 29 0a 20 20 20 20 20 26 26 20  RDERED).     && 
2ab20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
2ab30 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
2ab40 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
2ab50 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
2ab60 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
2ab70 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
2ab80 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
2ab90 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
2aba0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
2abb0 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
2abc0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
2abd0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
2abe0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
2abf0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
2ac00 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
2ac10 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
2ac20 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
2ac30 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
2ac40 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2ac50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2ac60 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2ac70 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
2ac80 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
2ac90 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
2aca0 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
2acb0 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
2acc0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
2acd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2ace0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2acf0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
2ad00 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
2ad10 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e  RangeStart = fin
2ad20 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
2ad30 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
2ad40 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64  O_GT|WO_GE), pId
2ad50 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
2ad60 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
2ad70 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2ad80 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
2ad90 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
2ada0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
2adb0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
2adc0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
2add0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
2ade0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
2adf0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
2ae00 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
2ae10 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2ae20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
2ae30 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
2ae40 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2ae50 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74  pLevel, pWC, not
2ae60 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67  Ready, nExtraReg
2ae70 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20  , &zStartAff.   
2ae80 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20   );.    zEndAff 
2ae90 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2aea0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  p(pParse->db, zS
2aeb0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64  tartAff);.    ad
2aec0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
2aed0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
2aee0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
2aef0 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
2af00 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
2af10 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
2af20 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
2af30 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
2af40 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
2af50 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
2af60 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
2af70 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
2af80 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
2af90 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
2afa0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
2afb0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  pIdx->nColumn &&
2afc0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
2afd0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
2afe0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
2aff0 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
2b000 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e  pIdx->nColumn==n
2b010 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
2b020 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
2b030 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
2b040 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
2b050 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
2b060 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
2b070 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
2b080 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
2b090 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b0a0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
2b0b0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
2b0c0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
2b0d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2b0e0 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
2b0f0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
2b100 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
2b110 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
2b120 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
2b130 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2b140 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74  _GE );.    start
2b150 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
2b160 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
2b170 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
2b180 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
2b190 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
2b1a0 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
2b1b0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
2b1c0 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
2b1d0 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
2b1e0 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
2b1f0 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
2b200 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
2b210 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
2b220 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
2b230 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
2b240 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
2b250 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
2b260 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
2b270 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
2b280 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
2b290 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
2b2a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2b2b0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
2b2c0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
2b2d0 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
2b2e0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
2b2f0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
2b300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b310 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
2b320 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
2b330 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
2b340 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2b350 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
2b360 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2b370 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2b380 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
2b390 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
2b3a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
2b3b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
2b3c0 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
2b3d0 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
2b3e0 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
2b3f0 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
2b400 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
2b410 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
2b420 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
2b430 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
2b440 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
2b450 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
2b460 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
2b470 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
2b480 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
2b490 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
2b4a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2b4b0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
2b4c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
2b4d0 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
2b4e0 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
2b4f0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
2b500 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
2b510 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
2b520 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
2b530 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
2b540 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
2b550 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
2b560 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2b570 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
2b580 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
2b590 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51  }else if( isMinQ
2b5a0 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  uery ){.      sq
2b5b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b5c0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
2b5d0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
2b5e0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
2b5f0 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
2b600 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
2b610 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
2b620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
2b630 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
2b640 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
2b650 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61  Constraint, zSta
2b660 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d  rtAff);.    op =
2b670 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
2b680 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
2b690 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
2b6a0 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73  + bRev];.    ass
2b6b0 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
2b6c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
2b6d0 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
2b6e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
2b6f0 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65  P_Last );.    te
2b700 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
2b710 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73  eekGt );.    tes
2b720 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
2b730 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGe );.    test
2b740 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
2b750 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kLe );.    testc
2b760 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
2b770 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lt );.    sqlite
2b780 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2b790 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
2b7a0 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
2b7b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a   nConstraint);..
2b7c0 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
2b7d0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e  value for the in
2b7e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2b7f0 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  int at the end o
2b800 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
2b810 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ge (if any)..   
2b820 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
2b830 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
2b840 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
2b850 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
2b860 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ht = pRangeEnd->
2b870 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
2b880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2b890 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
2b8a0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
2b8b0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
2b8c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2b8d0 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
2b8e0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
2b8f0 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  f( (pRangeEnd->w
2b900 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
2b910 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
2b920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2b930 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
2b940 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
2b950 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
2b960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b970 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20   zEndAff ){.    
2b980 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
2b990 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2b9a0 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
2b9b0 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
2b9c0 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
2b9d0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
2b9e0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
2b9f0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
2ba00 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
2ba10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
2ba20 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
2ba30 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
2ba40 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
2ba50 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
2ba60 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
2ba70 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
2ba80 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
2ba90 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
2baa0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
2bab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2bac0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
2bad0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
2bae0 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  e(pRight, zEndAf
2baf0 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
2bb00 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71       zEndAff[nEq
2bb10 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
2bb20 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
2bb30 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63       }  .      c
2bb40 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
2bb50 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2bb60 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66  , nEq+1, zEndAff
2bb70 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
2bb80 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
2bb90 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
2bba0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
2bbb0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
2bbc0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
2bbd0 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  2 */.    }.    s
2bbe0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
2bbf0 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
2bc00 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
2bc10 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
2bc20 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20  b, zEndAff);..  
2bc30 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
2bc40 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
2bc50 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
2bc60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2bc70 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
2bc80 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
2bc90 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
2bca0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2bcb0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
2bcc0 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
2bcd0 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
2bce0 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
2bcf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
2bd00 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
2bd10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
2bd20 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
2bd30 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
2bd40 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
2bd50 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2bd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bd70 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
2bd80 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
2bd90 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
2bda0 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
2bdb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2bdc0 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
2bdd0 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
2bde0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2bdf0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
2be00 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
2be10 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2be20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
2be30 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
2be40 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
2be50 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
2be60 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
2be70 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
2be80 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
2be90 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
2bea0 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
2beb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2bec0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
2bed0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
2bee0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2bef0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
2bf00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2bf10 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
2bf20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
2bf30 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
2bf40 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2bf50 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
2bf60 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
2bf70 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
2bf80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2bf90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2bfa0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
2bfb0 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20  r, nEq, r1);.   
2bfc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2bfd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
2bfe0 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29  l, r1, addrCont)
2bff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c000 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2c010 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
2c020 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
2c030 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
2c040 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
2c050 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
2c060 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
2c070 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
2c080 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
2c090 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21  eEnd);.    if( !
2c0a0 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
2c0b0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
2c0c0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
2c0d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2c0e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
2c0f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c100 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
2c110 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
2c120 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
2c130 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
2c140 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
2c150 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
2c160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
2c180 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
2c190 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
2c1a0 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a  d seek */.    }.
2c1b0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
2c1c0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
2c1d0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
2c1e0 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
2c1f0 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
2c200 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
2c210 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
2c220 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
2c230 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
2c240 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
2c250 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2c260 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  E_UNIQUE ){.    
2c270 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
2c280 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
2c290 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
2c2a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
2c2b0 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
2c2c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
2c2d0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
2c2e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
2c2f0 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
2c300 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2c310 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2c320 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
2c330 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
2c340 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
2c350 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
2c360 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
2c370 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2c380 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
2c390 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2c3a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c3b0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
2c3c0 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65  TION.  if( pLeve
2c3d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2c3e0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2c3f0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
2c400 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  4:  Two or more 
2c410 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
2c420 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
2c430 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
2c440 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
2c450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2c460 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2c470 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
2c480 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2c490 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
2c4a0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
2c4b0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
2c4c0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
2c4d0 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
2c4e0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
2c4f0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c500 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
2c510 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
2c520 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
2c530 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
2c540 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
2c550 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
2c560 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
2c570 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
2c580 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
2c590 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2c5a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2c5b0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
2c5c0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
2c5d0 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
2c5e0 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
2c5f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2c600 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
2c610 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
2c620 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
2c630 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
2c640 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
2c650 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
2c660 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
2c670 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
2c680 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
2c690 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
2c6a0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
2c6b0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
2c6c0 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
2c6d0 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
2c6e0 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
2c6f0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2c700 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
2c710 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2c720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2c730 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
2c740 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
2c750 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2c770 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
2c780 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
2c790 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
2c7a0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
2c7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2c7c0 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
2c7d0 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
2c7e0 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
2c7f0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
2c800 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
2c810 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
2c820 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
2c830 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
2c840 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
2c850 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
2c860 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
2c870 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
2c880 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
2c890 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
2c8a0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
2c8b0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
2c8c0 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2c8e0 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
2c8f0 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
2c900 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
2c910 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
2c920 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
2c930 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
2c940 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
2c950 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
2c960 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
2c970 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
2c980 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
2c990 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2c9a0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
2c9b0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
2c9c0 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
2c9d0 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
2c9e0 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
2c9f0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
2ca00 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
2ca10 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
2ca20 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
2ca30 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
2ca40 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
2ca50 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49  eration */.    I
2ca60 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20  ndex *pCov = 0; 
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ca80 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e  otential coverin
2ca90 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c  g index (or NULL
2caa0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  ) */.    int iCo
2cab0 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vCur = pParse->n
2cac0 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f  Tab++;  /* Curso
2cad0 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  r used for index
2cae0 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20   scans (if any) 
2caf0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
2cb00 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2cb10 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
2cb20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
2cb30 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
2cb40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
2cb50 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb70 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
2cb80 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
2cb90 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
2cba0 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbc0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2cbd0 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
2cbe0 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
2cbf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2cc00 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
2cc10 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
2cc20 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
2cc30 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2cc60 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
2cc70 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
2cc80 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
2cc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
2cca0 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
2ccb0 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
2ccc0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ccf0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45  counter */.    E
2cd00 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
2cd10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cd20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
2cd30 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
2cd40 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65  n */.   .    pTe
2cd50 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  rm = pLevel->pla
2cd60 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61  n.u.pTerm;.    a
2cd70 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
2cd80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2cd90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2cda0 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
2cdb0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
2cdc0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
2cdd0 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
2cde0 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
2cdf0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
2ce00 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
2ce10 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
2ce20 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
2ce30 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
2ce40 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
2ce50 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
2ce60 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2ce70 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
2ce80 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
2ce90 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
2cea0 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
2ceb0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
2cec0 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
2ced0 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
2cee0 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
2cef0 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
2cf00 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2cf10 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
2cf20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
2cf30 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
2cf40 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
2cf50 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
2cf60 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2cf70 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
2cf80 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
2cf90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2cfa0 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
2cfb0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
2cfc0 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
2cfd0 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
2cfe0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2cff0 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
2d000 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
2d010 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
2d020 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d040 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
2d050 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
2d060 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
2d070 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
2d080 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
2d090 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
2d0a0 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
2d0b0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28  >nAlloc = (i16)(
2d0c0 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
2d0d0 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
2d0e0 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
2d0f0 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
2d100 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
2d110 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
2d120 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
2d130 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
2d140 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
2d150 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
2d160 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
2d170 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2d180 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
2d190 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
2d1a0 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
2d1b0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
2d1c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
2d1e0 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
2d1f0 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
2d200 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2d210 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
2d220 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
2d230 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
2d240 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
2d250 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
2d260 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
2d270 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
2d280 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
2d290 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
2d2a0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2d2b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
2d2c0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2d2d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
2d2e0 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
2d2f0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
2d300 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
2d310 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
2d320 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
2d330 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
2d340 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
2d350 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
2d360 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
2d370 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
2d380 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
2d390 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
2d3a0 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
2d3b0 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
2d3c0 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
2d3d0 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
2d3e0 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
2d3f0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2d400 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
2d410 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
2d420 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
2d430 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
2d440 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
2d450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d460 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2d470 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2d480 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
2d490 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
2d4a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2d4b0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
2d4c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d4d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d4e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
2d4f0 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
2d500 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
2d510 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
2d520 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2d530 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
2d540 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
2d550 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
2d560 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
2d570 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
2d580 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
2d590 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
2d5a0 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2d5b0 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
2d5c0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2d5d0 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
2d5e0 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
2d5f0 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
2d600 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
2d610 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
2d620 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
2d630 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
2d640 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
2d650 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2d660 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
2d670 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
2d680 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
2d690 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
2d6a0 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
2d6b0 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
2d6c0 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
2d6d0 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
2d6e0 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
2d6f0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
2d700 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
2d710 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2d720 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2d730 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
2d740 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
2d750 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
2d760 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d770 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
2d780 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
2d790 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
2d7a0 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
2d7b0 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
2d7c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
2d7d0 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
2d7e0 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
2d7f0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2d800 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2d810 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
2d820 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2d830 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
2d840 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2d850 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49  VIRTUAL|TERM_ORI
2d860 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
2d870 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
2d880 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
2d890 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
2d8a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2d8b0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2d8c0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
2d8d0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
2d8e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
2d8f0 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
2d900 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2d910 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
2d920 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2d930 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
2d940 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
2d950 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2d960 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
2d970 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
2d980 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2d990 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
2d9a0 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
2d9b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
2d9c0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2d9d0 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
2d9e0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
2d9f0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
2da00 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
2da10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2da20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
2da30 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
2da40 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
2da50 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
2da60 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
2da70 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
2da80 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
2da90 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  pOrTerm->pExpr;.
2daa0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
2dab0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2dac0 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
2dad0 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
2dae0 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
2daf0 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
2db00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2db10 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
2db20 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
2db30 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
2db40 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
2db50 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
2db60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2db70 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
2db80 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
2dbb0 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  PEN_CLOSE | WHER
2dbc0 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20  E_AND_ONLY |.   
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbe0 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
2dbf0 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
2dc00 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43  NETABLE_ONLY, iC
2dc10 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
2dc20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
2dc30 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
2dc40 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2dc50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2dc60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
2dc70 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
2dc80 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
2dc90 70 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pLvl;.          
2dca0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2dcc0 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
2dcd0 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
2dce0 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
2dcf0 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
2dd00 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
2dd10 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2dd20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
2dd30 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
2dd40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
2dd50 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
2dd60 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
2dd70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
2dd80 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
2dd90 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   r = sqlite3Expr
2dda0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
2ddb0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
2ddc0 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
2ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77            regRow
2de00 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
2de10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2de20 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
2de30 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
2de40 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  wset,.          
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2de70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2de80 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20  +2, r, iSet);.  
2de90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2deb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2dec0 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
2ded0 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
2dee0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
2def0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
2df00 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
2df10 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
2df20 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
2df30 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
2df40 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
2df50 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
2df60 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
2df70 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
2df80 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
2df90 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
2dfa0 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
2dfb0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
2dfc0 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
2dfd0 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
2dfe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2dff0 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
2e000 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
2e010 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
2e020 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
2e030 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
2e040 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2e050 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
2e060 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
2e070 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
2e080 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
2e090 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
2e0a0 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
2e0b0 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
2e0c0 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
2e0d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2e0e0 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
2e0f0 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
2e100 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
2e110 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
2e120 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
2e130 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
2e140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2e150 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2e160 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
2e170 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
2e180 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
2e190 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
2e1a0 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
2e1b0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
2e1c0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
2e1d0 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
2e1e0 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
2e1f0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
2e200 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
2e210 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
2e220 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
2e230 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
2e240 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
2e250 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
2e260 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
2e270 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
2e280 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2e290 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
2e2a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
2e2b0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
2e2c0 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
2e2d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
2e2e0 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
2e2f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e300 20 70 4c 76 6c 20 3d 20 26 70 53 75 62 57 49 6e   pLvl = &pSubWIn
2e310 66 6f 2d 3e 61 5b 30 5d 3b 0a 20 20 20 20 20 20  fo->a[0];.      
2e320 20 20 20 20 69 66 28 20 28 70 4c 76 6c 2d 3e 70      if( (pLvl->p
2e330 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e340 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
2e350 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
2e360 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  Lvl->plan.wsFlag
2e370 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2e380 4e 44 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20  NDEX)==0.       
2e390 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
2e3a0 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49   pLvl->plan.u.pI
2e3b0 64 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  dx==pCov).      
2e3c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2e3d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
2e3e0 3e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  >iIdxCur==iCovCu
2e3f0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
2e400 20 70 43 6f 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c   pCov = pLvl->pl
2e410 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
2e420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e430 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
2e440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
2e450 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
2e460 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
2e470 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
2e480 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
2e490 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
2e4a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2e4b0 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
2e4c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
2e4d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e4e0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2e4f0 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
2e500 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
2e510 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
2e520 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
2e530 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
2e540 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
2e550 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2e560 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
2e570 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29  e->db, pAndExpr)
2e580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e590 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2e5a0 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
2e5b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2e5c0 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
2e5d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e5e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
2e5f0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
2e600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2e610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
2e620 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
2e630 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2e640 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
2e650 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e  ackFree(pParse->
2e660 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
2e670 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
2e680 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
2e690 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
2e6a0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
2e6b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e6c0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
2e6d0 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
2e6e0 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73  ase 5:  There is
2e6f0 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
2e700 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
2e710 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
2e720 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
2e730 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
2e740 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
2e750 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
2e760 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
2e770 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
2e780 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2e790 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
2e7a0 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
2e7b0 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
2e7c0 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
2e7d0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
2e7e0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
2e7f0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
2e800 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
2e810 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
2e820 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
2e830 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
2e840 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e850 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
2e860 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
2e870 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
2e880 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
2e890 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
2e8a0 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52 65  ;.  }.  newNotRe
2e8b0 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
2e8c0 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70   ~getMask(pWC->p
2e8d0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
2e8e0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
2e8f0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
2e900 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
2e910 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
2e920 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
2e930 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
2e940 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
2e950 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  es..  **.  ** IM
2e960 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
2e970 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54   R-49525-50935 T
2e980 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  erms that cannot
2e990 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74 68   be satisfied th
2e9a0 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75  rough.  ** the u
2e9b0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65  se of indices be
2e9c0 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74 20  come tests that 
2e9d0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 67  are evaluated ag
2e9e0 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f  ainst each row o
2e9f0 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76  f.  ** the relev
2ea00 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73  ant input tables
2ea10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
2ea20 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
2ea30 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
2ea40 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
2ea50 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
2ea60 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2ea70 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2ea80 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50  IRTUAL ); /* IMP
2ea90 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
2eaa0 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
2eab0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2eac0 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
2ead0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
2eae0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
2eaf0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
2eb00 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
2eb10 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2eb20 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f  rereqAll & newNo
2eb30 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
2eb40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2eb50 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
2eb60 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
2eb70 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2eb80 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2eb90 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2eba0 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
2ebb0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
2ebc0 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
2ebd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2ebe0 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
2ebf0 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
2ec00 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
2ec10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2ec20 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
2ec30 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2ec40 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
2ec50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2ec60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ec70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2ec80 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
2ec90 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2eca0 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
2ecb0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
2ecc0 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
2ecd0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
2ece0 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
2ecf0 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
2ed00 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
2ed10 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
2ed20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
2ed30 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
2ed40 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
2ed50 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
2ed60 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
2ed70 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
2ed80 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
2ed90 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
2eda0 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
2edb0 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
2edc0 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
2edd0 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
2ede0 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
2edf0 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
2ee00 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
2ee10 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
2ee20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
2ee30 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
2ee40 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
2ee50 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
2ee60 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
2ee70 2a 70 45 3b 0a 20 20 20 20 57 68 65 72 65 54 65  *pE;.    WhereTe
2ee80 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 45 78  rm *pAlt;.    Ex
2ee90 70 72 20 73 45 71 3b 0a 20 20 20 20 69 66 28 20  pr sEq;.    if( 
2eea0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2eeb0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
2eec0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
2eed0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2eee0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
2eef0 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51  =(WO_EQUIV|WO_EQ
2ef00 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2ef10 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
2ef20 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20  tCursor!=iCur ) 
2ef30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
2ef40 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2ef50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2ef60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2ef70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2ef80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2ef90 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2efa0 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29  t & newNotReady)
2efb0 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
2efc0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
2efd0 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
2efe0 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
2eff0 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
2f000 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
2f010 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
2f020 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
2f030 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2f040 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
2f050 65 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e;.    VdbeNoopC
2f060 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
2f070 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
2f080 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
2f090 73 45 71 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78  sEq = *pAlt->pEx
2f0a0 70 72 3b 0a 20 20 20 20 73 45 71 2e 70 4c 65 66  pr;.    sEq.pLef
2f0b0 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20  t = pE->pLeft;. 
2f0c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2f0d0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 73  False(pParse, &s
2f0e0 45 71 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  Eq, addrCont, SQ
2f0f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2f100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
2f110 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
2f120 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
2f130 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
2f140 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
2f150 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2f160 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
2f170 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
2f180 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
2f190 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
2f1a0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2f1b0 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
2f1c0 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
2f1d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f1e0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
2f1f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f200 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2f210 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
2f220 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
2f230 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
2f240 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
2f250 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
2f260 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2f270 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
2f280 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
2f290 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
2f2a0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
2f2b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2f2c0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2f2d0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
2f2e0 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
2f2f0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
2f300 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
2f310 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2f320 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
2f330 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
2f340 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
2f350 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
2f360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f370 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
2f380 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65  eqAll & newNotRe
2f390 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
2f3a0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
2f3b0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2f3c0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
2f3d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2f3e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
2f3f0 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
2f400 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2f410 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
2f420 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43  rm->pExpr, addrC
2f430 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
2f440 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
2f450 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
2f460 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
2f470 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2f480 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2f490 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
2f4a0 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e  eg);..  return n
2f4b0 65 77 4e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  ewNotReady;.}..#
2f4c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2f4d0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
2f4e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2f4f0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
2f500 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
2f510 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
2f520 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
2f530 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
2f540 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2f550 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
2f560 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
2f570 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
2f580 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
2f590 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2f5a0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2f5b0 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
2f5c0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
2f5d0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
2f5e0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
2f5f0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
2f600 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
2f610 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
2f620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f630 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
2f640 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
2f650 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
2f660 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66  ITE_TEST */..#if
2f670 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f680 44 45 42 55 47 29 20 5c 0a 20 20 20 20 26 26 20  DEBUG) \.    && 
2f690 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
2f6a0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2f6b0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
2f6c0 48 45 52 45 54 52 41 43 45 29 29 0a 2f 2a 0a 2a  HERETRACE))./*.*
2f6d0 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
2f6e0 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
2f6f0 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
2f700 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
2f710 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
2f720 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72  WhereLoop *p, Sr
2f730 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29  cList *pTabList)
2f740 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 32 2a 28  {.  int nb = 2*(
2f750 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b  (pTabList->nSrc+
2f760 31 35 29 2f 31 36 29 3b 0a 20 20 73 74 72 75 63  15)/16);.  struc
2f770 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2f780 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  pItem = pTabList
2f790 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
2f7a0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2f7b0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
2f7c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2f7d0 28 22 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  ("%2d.%0*llx.%0*
2f7e0 6c 6c 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  llx",.          
2f7f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
2f800 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
2f810 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
2f820 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
2f830 62 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22  bugPrintf(" %8s"
2f840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f850 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
2f860 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
2f870 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
2f880 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
2f890 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2f8a0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2f8b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ){.    if( p->u.
2f8c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a  btree.pIndex ){.
2f8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2f8e0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 32 73  ugPrintf(".%-12s
2f8f0 20 25 32 64 22 2c 0a 20 20 20 20 20 20 20 20 20   %2d",.         
2f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f910 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2f920 78 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  x->zName, p->u.b
2f930 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
2f940 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2f950 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f960 25 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %16s","");.    }
2f970 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2f980 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
2f990 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2f9a0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
2f9b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
2f9c0 64 2c 5c 22 25 73 5c 22 29 22 2c 20 70 2d 3e 75  d,\"%s\")", p->u
2f9d0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 70 2d 3e  .vtab.idxNum,p->
2f9e0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
2f9f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fa00 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
2fa10 69 6e 74 66 28 22 28 25 64 29 22 2c 20 70 2d 3e  intf("(%d)", p->
2fa20 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 29 3b 0a  u.vtab.idxNum);.
2fa30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2fa40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
2fa50 2d 31 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -15s", z);.    s
2fa60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
2fa70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
2fa80 75 67 50 72 69 6e 74 66 28 22 20 66 67 20 25 30  ugPrintf(" fg %0
2fa90 38 78 20 4e 20 25 32 64 22 2c 20 70 2d 3e 77 73  8x N %2d", p->ws
2faa0 46 6c 61 67 73 2c 20 70 2d 3e 6e 54 65 72 6d 29  Flags, p->nTerm)
2fab0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
2fac0 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 2e  Printf(" cost %.
2fad0 34 67 2c 25 2e 34 67 2c 25 2e 34 67 5c 6e 22 2c  4g,%.4g,%.4g\n",
2fae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2faf0 20 20 20 20 20 20 70 2d 3e 70 72 65 72 65 71 2c        p->prereq,
2fb00 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
2fb10 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d  Run, p->nOut);.}
2fb20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
2fb30 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
2fb40 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
2fb50 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
2fb60 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
2fb70 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
2fb80 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
2fb90 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
2fba0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2fbb0 62 2c 20 70 2d 3e 61 54 65 72 6d 29 3b 0a 20 20  b, p->aTerm);.  
2fbc0 70 2d 3e 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20  p->aTerm = 0;.  
2fbd0 70 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  p->nTerm = 0;.  
2fbe0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
2fbf0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2fc00 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
2fc10 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  if( p->u.vtab.ne
2fc20 65 64 46 72 65 65 20 29 20 73 71 6c 69 74 65 33  edFree ) sqlite3
2fc30 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
2fc40 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 2d 3e  idxStr);.    p->
2fc50 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
2fc60 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74  = 0;.    p->u.vt
2fc70 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
2fc80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
2fc90 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
2fca0 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
2fcb0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
2fcc0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2fcd0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
2fce0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
2fcf0 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
2fd00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
2fd10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
2fd20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
2fd30 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
2fd40 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
2fd50 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
2fd60 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2fd70 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
2fd80 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
2fd90 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
2fda0 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
2fdb0 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
2fdc0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2fdd0 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57  info *pInfo = pW
2fde0 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49  Info->a[i].pIdxI
2fdf0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
2fe00 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2fe10 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f  /* assert( pInfo
2fe20 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2fe30 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  tr==0 || db->mal
2fe40 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a  locFailed ); */.
2fe50 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66          if( pInf
2fe60 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2fe70 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
2fe80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2fe90 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2fea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2feb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2fec0 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , pInfo);.      
2fed0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  }.      if( pWIn
2fee0 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73  fo->a[i].plan.ws
2fef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2ff00 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  MP_INDEX ){.    
2ff10 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
2ff20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2ff30 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
2ff40 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
2ff50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ff60 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2ff70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
2ff80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ff90 72 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20  ree(db, pIdx);. 
2ffa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ffb0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
2ffc0 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e  ClauseClear(pWIn
2ffd0 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 77 68  fo->pWC);.    wh
2ffe0 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
2fff0 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
30000 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
30010 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
30020 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
30030 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
30040 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
30050 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
30060 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30070 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
30080 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
30090 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
300a0 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
300b0 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
300c0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
300d0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
300e0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
300f0 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
30100 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
30110 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
30120 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
30130 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
30140 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
30150 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
30160 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
30170 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
30180 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
30190 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
301a0 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
301b0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
301c0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
301d0 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
301e0 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
301f0 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
30200 73 65 64 20 6e 6f 20 74 68 65 20 74 65 6d 70 6c  sed no the templ
30210 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
30220 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
30230 72 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  rt(WhereInfo *pW
30240 49 6e 66 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Info, WhereLoop 
30250 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
30260 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
30270 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20  v, *p, *pNext = 
30280 30 2c 20 2a 70 54 6f 46 72 65 65 20 3d 20 30 3b  0, *pToFree = 0;
30290 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
302a0 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  aTerm = 0;.  sql
302b0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
302c0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
302d0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
302e0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
302f0 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69  eLoop to overwri
30300 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b  te, or which tak
30310 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79  es.  ** priority
30320 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e   over pTemplate.
30330 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72  .  */.  for(ppPr
30340 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  ev=&pWInfo->pLoo
30350 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70  ps, p=*ppPrev; p
30360 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
30370 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
30380 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
30390 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
303a0 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iTab ) continue;
303b0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
303c0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
303d0 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65  >prereq)==p->pre
303e0 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
303f0 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65  Setup<=pTemplate
30400 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26  ->rSetup.     &&
30410 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c   p->rRun<=pTempl
30420 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b  ate->rRun.    ){
30430 0a 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  .      /* Alread
30440 79 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 71 75  y holding an equ
30450 61 6c 20 6f 72 20 62 65 74 74 65 72 20 57 68 65  al or better Whe
30460 72 65 4c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2a  reLoop..      **
30470 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
30480 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69  changing or addi
30490 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
304a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
304b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
304c0 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
304d0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
304e0 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
304f0 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
30500 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
30510 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20  late->rSetup.   
30520 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
30530 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20  emplate->rRun.  
30540 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76    ){.      /* Ov
30550 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
30560 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
30570 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65 20  th a better one 
30580 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  */.      pNext =
30590 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
305a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c       whereLoopCl
305b0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ear(db, p);.    
305c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
305d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
305e0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
305f0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
30600 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
30610 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
30620 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
30630 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
30640 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
30650 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
30660 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
30670 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
30680 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
30690 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  ==0 ){.    p = p
306a0 54 6f 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  ToFree = sqlite3
306b0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
306c0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
306d0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
306e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
306f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
30700 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65  ( pTemplate->nTe
30710 72 6d 20 29 7b 0a 20 20 20 20 70 61 54 65 72 6d  rm ){.    paTerm
30720 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
30730 6f 63 52 61 77 28 64 62 2c 20 70 54 65 6d 70 6c  ocRaw(db, pTempl
30740 61 74 65 2d 3e 6e 54 65 72 6d 2a 73 69 7a 65 6f  ate->nTerm*sizeo
30750 66 28 70 2d 3e 61 54 65 72 6d 5b 30 5d 29 29 3b  f(p->aTerm[0]));
30760 0a 20 20 20 20 69 66 28 20 70 61 54 65 72 6d 3d  .    if( paTerm=
30770 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
30780 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
30790 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  oFree);.      re
307a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
307b0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  M;.    }.  }.  *
307c0 70 20 3d 20 2a 70 54 65 6d 70 6c 61 74 65 3b 0a  p = *pTemplate;.
307d0 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
307e0 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
307f0 76 20 3d 20 70 3b 0a 20 20 70 2d 3e 61 54 65 72  v = p;.  p->aTer
30800 6d 20 3d 20 70 61 54 65 72 6d 3b 0a 20 20 69 66  m = paTerm;.  if
30810 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65  ( pTemplate->nTe
30820 72 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  rm ){.    memcpy
30830 28 70 2d 3e 61 54 65 72 6d 2c 20 70 54 65 6d 70  (p->aTerm, pTemp
30840 6c 61 74 65 2d 3e 61 54 65 72 6d 2c 20 70 54 65  late->aTerm, pTe
30850 6d 70 6c 61 74 65 2d 3e 6e 54 65 72 6d 2a 73 69  mplate->nTerm*si
30860 7a 65 6f 66 28 70 2d 3e 61 54 65 72 6d 5b 30 5d  zeof(p->aTerm[0]
30870 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ));.  }.  if( (p
30880 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
30890 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
308a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
308b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
308c0 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
308d0 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 20  ndex->tnum==0 ) 
308e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
308f0 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
30900 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 75      pTemplate->u
30910 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
30920 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
30930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30940 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
30950 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
30960 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
30970 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
30980 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
30990 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
309a0 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
309b0 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
309c0 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
309d0 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
309e0 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
309f0 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
30a00 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
30a10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
30a20 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
30a30 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
30a40 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
30a50 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
30a60 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
30a70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
30a80 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
30a90 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
30aa0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
30ab0 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
30ac0 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
30ae0 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
30af0 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20  */.  int nInMul 
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30b20 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
30b30 20 74 6f 20 49 4e 20 2a 2f 0a 29 7b 0a 20 20 73   to IN */.){.  s
30b40 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b60 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
30b70 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
30b80 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
30b90 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
30ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
30bb0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
30bc0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
30bd0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
30be0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
30bf0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
30c00 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
30c10 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
30c20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c40 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
30c50 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
30c60 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
30c70 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
30c80 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
30c90 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
30ca0 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  rms */.  WhereLo
30cb0 6f 70 20 73 61 76 65 64 4c 6f 6f 70 3b 20 20 20  op savedLoop;   
30cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
30cd0 64 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  d original conte
30ce0 6e 74 20 6f 66 20 70 4e 65 77 5b 5d 20 2a 2f 0a  nt of pNew[] */.
30cf0 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
30d20 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
30d30 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
30d40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30d60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
30d70 64 62 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 64  db = pBuilder->d
30d80 62 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  b;.  pNew = pBui
30d90 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
30da0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
30db0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
30dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
30dd0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
30de0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
30df0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
30e00 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
30e10 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
30e20 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  be->nColumn );. 
30e30 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
30e40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30e50 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
30e60 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
30e70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
30e80 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
30e90 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
30ea0 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
30eb0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
30ec0 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
30ed0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
30ee0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
30ef0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
30f00 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
30f10 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
30f20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
30f30 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
30f40 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
30f50 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 0a  _LT|WO_LE;.  }..
30f60 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
30f70 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
30f80 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
30f90 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
30fa0 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
30fb0 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
30fc0 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
30fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30fe0 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
30ff0 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 50 72 6f 62   iCol>=0 ? pProb
31000 65 20 3a 20 30 29 3b 0a 20 20 73 61 76 65 64 4c  e : 0);.  savedL
31010 6f 6f 70 20 3d 20 2a 70 4e 65 77 3b 0a 20 20 70  oop = *pNew;.  p
31020 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64  New->rSetup = (d
31030 6f 75 62 6c 65 29 30 3b 0a 20 20 66 6f 72 28 3b  ouble)0;.  for(;
31040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31050 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
31060 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
31070 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69  t(&scan)){.    i
31080 6e 74 20 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  nt nIn = 1;.    
31090 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
310a0 71 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 75 2e  q = savedLoop.u.
310b0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 70  btree.nEq;.    p
310c0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 73 61 76  New->nTerm = sav
310d0 65 64 4c 6f 6f 70 2e 6e 54 65 72 6d 3b 0a 20 20  edLoop.nTerm;.  
310e0 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 70 4e    pNew->aTerm[pN
310f0 65 77 2d 3e 6e 54 65 72 6d 2b 2b 5d 20 3d 20 70  ew->nTerm++] = p
31100 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
31110 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 4c  prereq = (savedL
31120 6f 6f 70 2e 70 72 65 72 65 71 20 7c 20 70 54 65  oop.prereq | pTe
31130 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
31140 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
31150 6c 66 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lf;.    if( pTer
31160 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
31170 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
31180 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
31190 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
311a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
311b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
311c0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
311d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
311e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
311f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
31200 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
31210 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20  )":  Assume the 
31220 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
31230 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
31240 20 20 6e 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20    nIn = 25;.    
31250 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
31260 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
31270 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
31280 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
31290 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
312a0 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
312b0 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
312c0 6e 49 6e 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  nIn = pExpr->x.p
312d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
312e0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
312f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
31300 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
31310 20 3d 20 28 64 6f 75 62 6c 65 29 70 50 72 6f 62   = (double)pProb
31320 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77  e->aiRowEst[pNew
31330 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 20 2a  ->u.btree.nEq] *
31340 20 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20   nInMul * nIn;. 
31350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
31360 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
31370 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
31380 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) ){.      pNew-
31390 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
313a0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
313b0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
313c0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  .nEq++;.      pN
313d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75 62  ew->nOut = (doub
313e0 6c 65 29 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  le)pProbe->aiRow
313f0 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Est[pNew->u.btre
31400 65 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 3b  e.nEq] * nInMul;
31410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
31420 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
31430 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
31440 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
31450 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
31460 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
31470 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
31480 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
31490 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f   savedLoop.nOut/
314a0 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  3;.    }else if(
314b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
314c0 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
314d0 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) ){.      pNew-
314e0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
314f0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
31500 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
31510 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
31520 20 3d 20 73 61 76 65 64 4c 6f 6f 70 2e 6e 4f 75   = savedLoop.nOu
31530 74 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t/3;.    }.    p
31540 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 70 4e 65 77  New->rRun = pNew
31550 2d 3e 6e 4f 75 74 20 2b 20 65 73 74 4c 6f 67 28  ->nOut + estLog(
31560 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
31570 5b 30 5d 29 2a 6e 49 6e 3b 0a 20 20 20 20 72 63  [0])*nIn;.    rc
31580 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
31590 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 49  rt(pBuilder->pWI
315a0 6e 66 6f 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  nfo, pNew);.    
315b0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
315c0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
315d0 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
315e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
315f0 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
31600 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  mn.    ){.      
31610 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
31620 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
31630 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
31640 49 6e 4d 75 6c 2a 6e 49 6e 29 3b 0a 20 20 20 20  InMul*nIn);.    
31650 7d 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 20 3d 20  }.  }.  *pNew = 
31660 73 61 76 65 64 4c 6f 6f 70 3b 0a 20 20 72 65 74  savedLoop;.  ret
31670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31680 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
31690 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74  op objects for t
316a0 68 65 20 69 54 61 62 2d 74 68 20 74 61 62 6c 65  he iTab-th table
316b0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 54   of the join.  T
316c0 68 61 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  hat.** table is 
316d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
316e0 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
316f0 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
31700 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
31710 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
31720 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
31730 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
31740 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
31750 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
31760 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31780 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
31790 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 42  o process */.  B
317a0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20  itmask mExtra   
317b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
317c0 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65  tra prerequesite
317d0 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73  s for using this
317e0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 49   table */.){.  I
317f0 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
31800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
31810 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
31820 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
31830 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
31840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
31850 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
31860 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
31870 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e   key */.  tRowcn
31880 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
31890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
318a0 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
318b0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
318c0 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
318d0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
318e0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
318f0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
31900 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73  sPk index */.  s
31910 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31920 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
31930 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
31940 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
31950 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
31960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31970 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
31980 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
31990 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
319a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
319b0 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
319c0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
319d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
319e0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
319f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
31a00 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
31a10 3e 70 4e 65 77 3b 0a 20 20 64 62 20 3d 20 70 42  >pNew;.  db = pB
31a20 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 70 53  uilder->db;.  pS
31a30 72 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  rc = pBuilder->p
31a40 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 69 54 61  TabList->a + iTa
31a50 62 3b 0a 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  b;.  pNew->maskS
31a60 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 70 42  elf = getMask(pB
31a70 75 69 6c 64 65 72 2d 3e 70 57 43 2d 3e 70 4d 61  uilder->pWC->pMa
31a80 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 69 43 75  skSet, pSrc->iCu
31a90 72 73 6f 72 29 3b 0a 0a 20 20 69 66 28 20 70 53  rsor);..  if( pS
31aa0 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
31ab0 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
31ac0 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
31ad0 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
31ae0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
31af0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53  .    pProbe = pS
31b00 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  rc->pIndex;.  }e
31b10 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
31b20 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
31b30 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
31b40 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
31b50 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
31b60 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
31b70 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
31b80 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
31b90 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
31ba0 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
31bb0 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
31bc0 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
31bd0 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
31be0 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
31bf0 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
31c00 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
31c10 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
31c20 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
31c30 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
31c40 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
31c50 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
31c60 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
31c70 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
31c80 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  );.    sPk.nColu
31c90 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
31ca0 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
31cb0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
31cc0 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77  aiRowEst = aiRow
31cd0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
31ce0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
31cf0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
31d00 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
31d10 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
31d20 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  [0] = pSrc->pTab
31d30 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61  ->nRowEst;.    a
31d40 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31  iRowEstPk[1] = 1
31d50 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
31d60 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
31d70 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
31d80 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
31d90 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
31da0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
31db0 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
31dc0 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
31dd0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
31de0 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
31df0 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
31e00 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
31e10 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
31e20 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
31e30 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
31e40 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 0a 20 20   = &sPk;.  }..  
31e50 2f 2a 20 49 6e 73 65 72 74 20 61 20 66 75 6c 6c  /* Insert a full
31e60 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
31e70 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
31e80 61 62 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ab;.  pNew->u.bt
31e90 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  ree.nEq = 0;.  p
31ea0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  New->nTerm = 0;.
31eb0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
31ec0 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 70 4e   (double)0;.  pN
31ed0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
31ee0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
31ef0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 4e  pIndex = 0;.  pN
31f00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  ew->wsFlags = 0;
31f10 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20  .  pNew->rRun = 
31f20 28 64 6f 75 62 6c 65 29 70 53 72 63 2d 3e 70 54  (double)pSrc->pT
31f30 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 70  ab->nRowEst;.  p
31f40 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f 75  New->nOut = (dou
31f50 62 6c 65 29 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ble)pSrc->pTab->
31f60 6e 52 6f 77 45 73 74 3b 0a 20 20 72 63 20 3d 20  nRowEst;.  rc = 
31f70 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
31f80 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
31f90 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 4c  , pNew);..  /* L
31fa0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
31fb0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
31fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
31fd0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
31fe0 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  e=pProbe->pNext)
31ff0 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
32000 2a 2a 70 61 54 65 72 6d 3b 0a 20 20 20 20 70 4e  **paTerm;.    pN
32010 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
32020 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  tra;.    pNew->i
32030 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
32040 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
32050 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
32060 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  >nTerm = 0;.    
32070 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
32080 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
32090 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
320a0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
320b0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
320c0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 20 20   = WHERE_IPK;.  
320d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
320e0 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d  itmask m = pSrc-
320f0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
32100 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
32110 28 6a 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  (j=pProbe->nColu
32120 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
32130 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
32140 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
32150 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
32160 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
32170 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
32180 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
32190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
321a0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77   }.      pNew->w
321b0 73 46 6c 61 67 73 20 3d 20 6d 3d 3d 30 20 3f 20  sFlags = m==0 ? 
321c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 3a  WHERE_IDX_ONLY :
321d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61   0;.    }.    pa
321e0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Term = sqlite3Db
321f0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4e 65 77  Realloc(db, pNew
32200 2d 3e 61 54 65 72 6d 2c 0a 20 20 20 20 20 20 20  ->aTerm,.       
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32220 20 20 20 20 20 20 20 28 70 50 72 6f 62 65 2d 3e         (pProbe->
32230 6e 43 6f 6c 75 6d 6e 2b 32 29 2a 73 69 7a 65 6f  nColumn+2)*sizeo
32240 66 28 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d  f(pNew->aTerm[0]
32250 29 29 3b 0a 20 20 20 20 69 66 28 20 70 61 54 65  ));.    if( paTe
32260 72 6d 3d 3d 30 20 29 7b 20 72 63 20 3d 20 53 51  rm==0 ){ rc = SQ
32270 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61  LITE_NOMEM; brea
32280 6b 3b 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 61  k; }.    pNew->a
32290 54 65 72 6d 20 3d 20 70 61 54 65 72 6d 3b 0a 20  Term = paTerm;. 
322a0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
322b0 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
322c0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ;..    rc = wher
322d0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
322e0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
322f0 63 2c 20 70 50 72 6f 62 65 2c 20 31 29 3b 0a 0a  c, pProbe, 1);..
32300 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
32310 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
32320 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
32330 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
32340 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
32350 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
32360 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
32370 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
32380 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
32390 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
323a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
323b0 72 20 74 68 65 20 69 54 61 62 2d 74 68 20 74 61  r the iTab-th ta
323c0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
323d0 20 20 54 68 61 74 0a 2a 2a 20 74 61 62 6c 65 20    That.** table 
323e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
323f0 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
32400 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
32410 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
32420 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
32430 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
32440 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
32450 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
32460 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  on */.  int iTab
32470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32480 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
32490 65 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a  e to process */.
324a0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
324c0 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
324d0 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
324e0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
324f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
32500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32510 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
32520 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
32530 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
32540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32550 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
32560 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32570 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
32580 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
32590 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
325a0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
325b0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
325c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
325d0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
325e0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
325f0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
32600 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
32610 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
32620 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
32630 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
32640 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
32650 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
32660 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
32670 65 72 6d 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  erm;.  int seenI
32680 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
32690 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
326a0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
326b0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
326c0 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
326d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
326e0 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
326f0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
32700 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
32710 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
32720 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
32730 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
32740 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
32750 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
32760 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
32770 65 72 65 54 65 72 6d 20 2a 2a 70 61 54 65 72 6d  ereTerm **paTerm
32780 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
32790 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50 61 72 73  ITE_OK;..  pPars
327a0 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 50  e = pBuilder->pP
327b0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
327c0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d  rse->db;.  pWC =
327d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
327e0 20 20 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64    pSrc = &pBuild
327f0 65 72 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  er->pTabList->a[
32800 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
32810 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 4e  pSrc->pTab;.  pN
32820 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
32830 4e 65 77 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  New;.  pIdxInfo 
32840 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
32850 6e 66 6f 28 70 50 61 72 73 65 2c 70 57 43 2c 70  nfo(pParse,pWC,p
32860 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f  Src,pBuilder->pO
32870 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
32880 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
32890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
328a0 3b 0a 20 20 70 61 54 65 72 6d 20 3d 20 73 71 6c  ;.  paTerm = sql
328b0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
328c0 2c 20 70 4e 65 77 2d 3e 61 54 65 72 6d 2c 0a 20  , pNew->aTerm,. 
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
328f0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
32900 74 2b 31 29 2a 73 69 7a 65 6f 66 28 70 4e 65 77  t+1)*sizeof(pNew
32910 2d 3e 61 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  ->aTerm[0]));.  
32920 69 66 28 20 70 61 54 65 72 6d 3d 3d 30 20 29 7b  if( paTerm==0 ){
32930 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
32940 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
32950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
32960 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
32970 20 70 4e 65 77 2d 3e 61 54 65 72 6d 20 3d 20 70   pNew->aTerm = p
32980 61 54 65 72 6d 3b 0a 20 20 70 4e 65 77 2d 3e 70  aTerm;.  pNew->p
32990 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
329a0 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a  w->iTab = iTab;.
329b0 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66    pNew->maskSelf
329c0 20 3d 20 67 65 74 4d 61 73 6b 28 70 42 75 69 6c   = getMask(pBuil
329d0 64 65 72 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53  der->pWC->pMaskS
329e0 65 74 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  et, pSrc->iCurso
329f0 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  r);.  pNew->rSet
32a00 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
32a10 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
32a20 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
32a30 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b  pNew->nTerm = 0;
32a40 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
32a50 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
32a60 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
32a70 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
32a80 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 50 68 61  age;..  for(iPha
32a90 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 32 3b  se=0; iPhase<=2;
32aa0 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20   iPhase++){.    
32ab0 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28  if( !seenIn && (
32ac0 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a  iPhase&1)!=0 ){.
32ad0 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a        iPhase++;.
32ae0 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65        if( iPhase
32af0 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >3 ) break;.    
32b00 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56  }.    if( !seenV
32b10 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29  ar && iPhase>1 )
32b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78   break;.    pIdx
32b30 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
32b40 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
32b50 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
32b60 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
32b70 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
32b80 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
32b90 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
32ba0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
32bb0 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
32bc0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
32bd0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
32be0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74  a[j];.      swit
32bf0 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20  ch( iPhase ){.  
32c00 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20        case 0:   
32c10 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
32c20 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f  thout IN operato
32c30 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  r */.          p
32c40 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
32c50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
32c60 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
32c70 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
32c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32c90 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  seenIn = 1;.    
32ca0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32cb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
32cc0 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
32cd0 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
32ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
32cf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
32d00 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
32d10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
32d20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
32d30 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
32d40 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
32d50 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
32d60 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
32d70 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
32d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
32d90 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
32da0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
32db0 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
32dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32dd0 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
32de0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
32df0 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
32e00 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
32e10 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
32e20 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
32e30 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
32e40 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
32e50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
32e60 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
32e70 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
32e80 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
32e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
32ea0 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
32eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
32ec0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
32ed0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
32ee0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32ef0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
32f00 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
32f10 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
32f20 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
32f30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
32f40 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
32f50 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
32f60 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
32f70 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
32f80 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
32f90 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
32fa0 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
32fb0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
32fc0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
32fd0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
32fe0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
32ff0 30 3b 0a 20 20 20 20 2f 2a 20 28 28 64 6f 75 62  0;.    /* ((doub
33000 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66  le)2) In case of
33010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
33020 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
33030 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  /.    pIdxInfo->
33040 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
33050 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
33060 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20   ((double)2);.  
33070 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
33080 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
33090 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
330a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
330b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
330c0 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43  _exit;.    pIdxC
330d0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
330e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
330f0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
33100 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
33110 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
33120 65 71 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  eq = 0;.    for(
33130 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
33140 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
33150 2b 29 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69  +) pNew->aTerm[i
33160 5d 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72  ] = 0;.    mxTer
33170 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  m = -1;.    for(
33180 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
33190 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
331a0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
331b0 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
331c0 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
331d0 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
331e0 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
331f0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
33200 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
33210 20 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e 66 6f   iTerm>=pIdxInfo
33220 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ->nConstraint.  
33230 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
33240 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
33250 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
33260 20 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b   || pNew->aTerm[
33270 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
33280 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
33290 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
332a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
332b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
332c0 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
332d0 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
332e0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
332f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33300 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
33310 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
33320 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
33330 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
33340 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
33350 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
33360 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
33370 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 54 65   pNew->aTerm[iTe
33380 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
33390 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
333a0 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
333b0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
333c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
333d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
333e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
333f0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
33400 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
33410 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
33420 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
33430 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
33440 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
33450 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
33460 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
33470 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
33480 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
33490 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
334a0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
334b0 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
334c0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
334d0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
334e0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
334f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
33500 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
33510 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
33520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33540 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
33550 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
33560 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
33570 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
33580 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
33590 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
335a0 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
335b0 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
335c0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
335d0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
335e0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
335f0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
33600 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
33610 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
33620 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
33630 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
33640 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
33650 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
33660 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
33670 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
33680 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
33690 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
336a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
336b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
336c0 28 20 69 3e 3d 70 49 64 78 49 6e 66 6f 2d 3e 6e  ( i>=pIdxInfo->n
336d0 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
336e0 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20      pNew->nTerm 
336f0 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
33700 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
33710 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
33720 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
33730 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
33740 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
33750 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
33760 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
33770 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
33780 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
33790 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
337a0 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
337b0 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
337c0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
337d0 65 72 65 64 20 3d 20 28 75 38 29 28 70 49 64 78  ered = (u8)(pIdx
337e0 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
337f0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
33800 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65  rSetup = (double
33810 29 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  )0;.      pNew->
33820 72 52 75 6e 20 3d 20 70 49 64 78 49 6e 66 6f 2d  rRun = pIdxInfo-
33830 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
33840 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
33850 20 3d 20 28 64 6f 75 62 6c 65 29 32 35 3b 0a 20   = (double)25;. 
33860 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
33870 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
33880 57 49 6e 66 6f 2c 20 70 4e 65 77 29 3b 0a 20 20  WInfo, pNew);.  
33890 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
338a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
338b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
338c0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
338d0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
338e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
338f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
33900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33910 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
33920 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
33930 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
33940 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
33950 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
33960 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
33970 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
33980 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
33990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
339a0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
339b0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
339c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
339d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
339e0 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
339f0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
33a00 69 6c 64 65 72 29 7b 0a 20 20 42 69 74 6d 61 73  ilder){.  Bitmas
33a10 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
33a20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
33a30 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
33a40 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
33a50 69 73 74 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  ist = pBuilder->
33a60 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
33a70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
33a80 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
33a90 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
33aa0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 71  ilder->pWC;.  sq
33ab0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 75 69  lite3 *db = pBui
33ac0 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  lder->db;.  int 
33ad0 6e 54 61 62 4c 69 73 74 20 3d 20 70 42 75 69 6c  nTabList = pBuil
33ae0 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 6e 4c 65  der->pWInfo->nLe
33af0 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  vel;.  int rc = 
33b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
33b10 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
33b20 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
33b30 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
33b40 72 69 67 68 74 20 2a 2f 0a 20 20 70 42 75 69 6c  right */.  pBuil
33b50 64 65 72 2d 3e 70 4e 65 77 20 3d 20 73 71 6c 69  der->pNew = sqli
33b60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
33b70 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
33b80 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 70 42  Loop));.  if( pB
33b90 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3d 3d 30 20  uilder->pNew==0 
33ba0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
33bb0 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 54 61  NOMEM;.  for(iTa
33bc0 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c  b=0, pItem=pTabL
33bd0 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61  ist->a; iTab<nTa
33be0 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70  bList; iTab++, p
33bf0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
33c00 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
33c10 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
33c20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
33c30 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
33c40 65 72 2c 20 69 54 61 62 2c 20 6d 45 78 74 72 61  er, iTab, mExtra
33c50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33c60 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
33c70 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
33c80 64 65 72 2c 20 69 54 61 62 2c 20 6d 45 78 74 72  der, iTab, mExtr
33c90 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
33ca0 72 69 6f 72 20 7c 3d 20 67 65 74 4d 61 73 6b 28  rior |= getMask(
33cb0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70  pWC->pMaskSet, p
33cc0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
33cd0 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
33ce0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
33cf0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
33d00 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72  0 ){.      mExtr
33d10 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  a = mPrior;.    
33d20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  }.    if( rc || 
33d30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33d40 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
33d50 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
33d60 64 62 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  db, pBuilder->pN
33d70 65 77 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  ew);.  pBuilder-
33d80 3e 70 4e 65 77 20 3d 20 30 3b 0a 20 20 72 65 74  >pNew = 0;.  ret
33d90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33da0 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
33db0 50 61 74 68 20 74 6f 20 73 65 65 20 69 66 20 69  Path to see if i
33dc0 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
33dd0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
33de0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
33df0 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
33e00 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
33e10 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 6f 70  parate source op
33e20 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
33e30 20 31 0a 2a 2a 20 69 66 20 69 74 20 64 6f 65 73   1.** if it does
33e40 20 61 6e 64 20 30 20 69 66 20 69 74 20 64 6f 65   and 0 if it doe
33e50 73 20 6e 6f 74 20 61 6e 64 20 2d 31 20 69 66 20  s not and -1 if 
33e60 77 65 20 63 61 6e 6e 6f 74 20 74 65 6c 6c 2e 0a  we cannot tell..
33e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
33e80 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
33e90 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
33ea0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
33eb0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
33ec0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 50  ause */.  WhereP
33ed0 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
33ee0 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
33ef0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
33f00 6e 74 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  nt nLoop,       
33f10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33f20 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
33f30 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
33f40 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
33f50 70 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  p      /* Add th
33f60 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
33f70 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
33f80 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 29 7b 0a  ->aLoop[] */.){.
33f90 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
33fa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
33fb0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
33fc0 20 72 65 74 75 72 6e 20 6e 4c 6f 6f 70 3d 3d 30   return nLoop==0
33fd0 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61   && pLoop->u.vta
33fe0 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
33ff0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 42 44  else{.    /* TBD
34000 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
34010 66 20 70 46 72 6f 6d 20 2b 20 70 57 4c 6f 6f 70  f pFrom + pWLoop
34020 20 73 61 74 69 73 66 69 65 73 20 74 68 65 20 4f   satisfies the O
34030 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2a 20  RDER BY..    ** 
34040 20 28 31 29 20 20 49 66 20 79 65 73 3a 20 20 20   (1)  If yes:   
34050 73 65 74 20 69 73 4f 72 64 65 72 65 64 56 61 6c  set isOrderedVal
34060 69 64 20 61 6e 64 20 69 73 4f 72 64 65 72 65 64  id and isOrdered
34070 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 20 20 28   to 1..    **  (
34080 32 29 20 20 49 66 20 6e 6f 3a 20 20 20 20 73 65  2)  If no:    se
34090 74 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  t isOrderedValid
340a0 20 74 6f 20 31 20 61 6e 64 20 69 73 4f 72 64 65   to 1 and isOrde
340b0 72 65 64 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  red to 0..    **
340c0 20 20 28 33 29 20 20 75 6e 6b 6e 6f 77 6e 3a 20    (3)  unknown: 
340d0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 72 65   no-op */.    re
340e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  turn 0;.  }.}...
340f0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
34100 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
34110 70 20 6f 62 6a 65 63 74 73 20 6f 6e 20 70 57 49  p objects on pWI
34120 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
34130 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
34140 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
34150 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
34160 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
34170 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
34180 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
34190 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
341a0 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
341b0 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
341c0 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lds..**.** Retur
341d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
341e0 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
341f0 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
34200 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
34210 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
34220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
34230 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
34240 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
34250 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6d 78 43  .  const int mxC
34260 68 6f 69 63 65 20 3d 20 31 30 3b 20 20 2f 2a 20  hoice = 10;  /* 
34270 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
34280 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
34290 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
342a0 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
342b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
342c0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
342d0 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
342e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
342f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34300 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
34310 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
34320 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
34330 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
34340 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
34350 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
34360 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34380 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
34390 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74  /.  double rCost
343a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
343b0 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20   Cost of a path 
343c0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6d 78 43 6f  */.  double mxCo
343d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
343e0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
343f0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
34400 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 53 6f   */.  double rSo
34410 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  rtCost;         
34420 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20  /* Cost to do a 
34430 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  sort */.  int nT
34440 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
34450 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34460 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
34470 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
34480 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
34490 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
344a0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
344b0 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
344c0 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
344d0 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
344e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
344f0 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
34500 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
34510 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
34520 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
34530 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
34540 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
34550 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
34560 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
34570 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
34580 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
34590 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
345a0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
345b0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
345c0 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
345d0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
345e0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
345f0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
34600 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
34610 2f 2a 20 4e 65 78 74 20 6c 6f 6f 70 20 2a 2f 0a  /* Next loop */.
34620 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
34630 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
34640 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
34650 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
34660 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
34670 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
34680 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
34690 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
346a0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 64   routine */..  d
346b0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
346c0 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
346d0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
346e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
346f0 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
34700 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  ist->nSrc );..  
34710 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
34720 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
34730 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72   for aTo and aFr
34740 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69  om */.  ii = (si
34750 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
34760 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
34770 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
34780 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d  ce*2;.  pSpace =
34790 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
347a0 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69  Raw(db, ii);.  i
347b0 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
347c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
347d0 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  EM;.  aTo = (Whe
347e0 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
347f0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
34800 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
34810 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
34820 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
34830 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
34840 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
34850 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  e);.  for(ii=0, 
34860 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3c 6d 78  pFrom=aTo; ii<mx
34870 43 68 6f 69 63 65 2a 32 3b 20 69 69 2b 2b 2c 20  Choice*2; ii++, 
34880 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
34890 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
348a0 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
348b0 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  }..  /* Seed the
348c0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
348d0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
348e0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
348f0 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
34900 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
34910 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 6e 46 72  (double)1;.  nFr
34920 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
34930 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
34940 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
34950 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
34960 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
34970 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
34980 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
34990 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
349a0 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
349b0 6f 72 74 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  ortCost = (doubl
349c0 65 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  e)0;.  if( pWInf
349d0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  o->pOrderBy==0 )
349e0 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
349f0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
34a00 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
34a10 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 65 73  /* Compute an es
34a20 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 63 6f  timate on the co
34a30 73 74 20 74 6f 20 73 6f 72 74 20 74 68 65 20 65  st to sort the e
34a40 6e 74 69 72 65 20 72 65 73 75 6c 74 20 73 65 74  ntire result set
34a50 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
34a60 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
34a70 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
34a80 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
34a90 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 4e 65  Loop; pWLoop=pNe
34aa0 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
34ab0 20 3d 20 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74   = pWLoop->pNext
34ac0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 72 43 6f 73  Loop;.      rCos
34ad0 74 20 3d 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  t = pWLoop->nOut
34ae0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
34af0 4e 65 78 74 20 26 26 20 70 4e 65 78 74 2d 3e 69  Next && pNext->i
34b00 54 61 62 3d 3d 70 57 4c 6f 6f 70 2d 3e 69 54 61  Tab==pWLoop->iTa
34b10 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  b ){.        if(
34b20 20 70 4e 65 78 74 2d 3e 6e 4f 75 74 3c 72 43 6f   pNext->nOut<rCo
34b30 73 74 20 29 20 72 43 6f 73 74 20 3d 20 70 4e 65  st ) rCost = pNe
34b40 78 74 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  xt->nOut;.      
34b50 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 2d    pNext = pNext-
34b60 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
34b70 20 20 7d 0a 20 20 20 20 20 20 72 53 6f 72 74 43    }.      rSortC
34b80 6f 73 74 20 2a 3d 20 72 43 6f 73 74 3b 0a 20 20  ost *= rCost;.  
34b90 20 20 7d 0a 20 20 20 20 72 53 6f 72 74 43 6f 73    }.    rSortCos
34ba0 74 20 2a 3d 20 65 73 74 4c 6f 67 28 72 53 6f 72  t *= estLog(rSor
34bb0 74 43 6f 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tCost);.  }..  /
34bc0 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
34bd0 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
34be0 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
34bf0 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
34c00 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
34c10 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
34c20 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
34c30 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
34c40 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
34c50 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
34c60 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
34c70 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
34c80 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
34c90 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
34ca0 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
34cb0 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
34cc0 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
34cd0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
34ce0 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
34cf0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
34d00 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
34d10 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
34d20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
34d30 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20  sk maskNew;.    
34d40 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
34d50 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
34d60 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
34d70 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
34d80 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
34d90 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
34da0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
34db0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
34dc0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
34dd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
34de0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
34df0 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
34e00 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
34e10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
34e20 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
34e30 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
34e40 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
34e50 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
34e60 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
34e70 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
34e80 20 20 20 20 72 43 6f 73 74 20 3d 20 70 57 4c 6f      rCost = pWLo
34e90 6f 70 2d 3e 72 53 65 74 75 70 20 2b 20 70 57 4c  op->rSetup + pWL
34ea0 6f 6f 70 2d 3e 72 52 75 6e 2a 70 46 72 6f 6d 2d  oop->rRun*pFrom-
34eb0 3e 6e 52 6f 77 20 2b 20 70 46 72 6f 6d 2d 3e 72  >nRow + pFrom->r
34ec0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  Cost;.        ma
34ed0 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
34ee0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
34ef0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
34f00 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
34f10 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
34f20 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
34f30 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
34f40 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
34f50 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
34f60 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oop) ){.        
34f70 20 20 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20      case 1:  /* 
34f80 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f  Yes.  pFrom+pWLo
34f90 6f 70 20 64 6f 65 73 20 73 61 74 69 73 66 79 20  op does satisfy 
34fa0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
34fb0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  use */.         
34fc0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
34fd0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
34fe0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
34ff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35010 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
35020 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57  /* No.  pFrom+pW
35030 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72  Loop will requir
35040 65 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  e a separate sor
35050 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
35060 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30     isOrdered = 0
35070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
35080 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
35090 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
350a0 20 20 72 43 6f 73 74 20 2b 3d 20 72 53 6f 72 74    rCost += rSort
350b0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
350c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
350d0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
350e0 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79  /* Cannot tell y
350f0 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f  et.  Try again o
35100 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  n the next itera
35110 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
35120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35140 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
35150 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
35160 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
35170 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
35180 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
35190 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
351a0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
351b0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
351c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
351d0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
351e0 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f  ==maskNew && pTo
351f0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
35200 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
35210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35220 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
35230 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35240 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
35250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
35260 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
35270 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74  && rCost>=mxCost
35280 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35290 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
352a0 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
352b0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
352c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
352d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
352e0 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54  for(jj=nTo-1; aT
352f0 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f  o[jj].rCost<mxCo
35300 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72  st; jj--){ asser
35310 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20  t(jj>0); }.     
35320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35330 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
35340 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35350 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
35360 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
35370 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
35390 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
353a0 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
353b0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
353c0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
353d0 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
353e0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
353f0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
35400 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
35410 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d  o->nRow = pFrom-
35420 3e 6e 52 6f 77 20 2a 20 70 57 4c 6f 6f 70 2d 3e  >nRow * pWLoop->
35430 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54  nOut;.        pT
35440 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  o->rCost = rCost
35450 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
35460 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
35470 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a  isOrderedValid;.
35480 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
35490 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
354a0 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
354b0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
354c0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
354d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
354e0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
354f0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
35500 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
35510 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
35520 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
35530 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b     mxCost = aTo[
35540 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  0].rCost;.      
35550 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
35560 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
35570 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
35580 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
35590 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
355a0 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74  >mxCost ) mxCost
355b0 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
355c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
355d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
355e0 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66   }..#if 0.    if
355f0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
35600 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ace ){.      sql
35610 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
35620 22 2d 2d 2d 2d 20 72 6f 75 6e 64 20 25 64 20 2d  "---- round %d -
35630 2d 2d 2d 20 6e 54 6f 3d 25 64 5c 6e 22 2c 20 69  --- nTo=%d\n", i
35640 4c 6f 6f 70 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  Loop, nTo);.    
35650 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35660 54 6f 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  To; ii++){.     
35670 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35680 72 69 6e 74 66 28 22 25 30 33 64 3a 20 20 63 6f  rintf("%03d:  co
35690 73 74 3d 25 67 20 20 6e 72 6f 77 3d 25 67 5c 6e  st=%g  nrow=%g\n
356a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 69  ",.           ii
356b0 2c 20 61 54 6f 5b 69 69 5d 2e 72 43 6f 73 74 2c  , aTo[ii].rCost,
356c0 20 61 54 6f 5b 69 69 5d 2e 6e 52 6f 77 29 3b 0a   aTo[ii].nRow);.
356d0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
356e0 3b 20 6a 6a 3c 3d 69 4c 6f 6f 70 3b 20 6a 6a 2b  ; jj<=iLoop; jj+
356f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  +){.          wh
35700 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 61 54 6f  ereLoopPrint(aTo
35710 5b 69 69 5d 2e 61 4c 6f 6f 70 5b 6a 6a 5d 2c 20  [ii].aLoop[jj], 
35720 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
35730 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35740 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
35750 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74  f..    /* Swap t
35760 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f  he roles of aFro
35770 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68  m and aTo for th
35780 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f  e next generatio
35790 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d  n */.    pFrom =
357a0 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20   aTo;.    aTo = 
357b0 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d  aFrom;.    aFrom
357c0 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46   = pFrom;.    nF
357d0 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a  rom = nTo;.  }..
357e0 20 20 2f 2a 20 54 45 4d 50 4f 52 41 52 59 20 2a    /* TEMPORARY *
357f0 2f 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  /.  if( nFrom==0
35800 20 29 7b 20 73 71 6c 69 74 65 33 44 62 46 72 65   ){ sqlite3DbFre
35810 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 20 72  e(db, pSpace); r
35820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35830 4f 52 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20  OR; }.  assert( 
35840 6e 46 72 6f 6d 3e 30 20 29 3b 0a 20 20 0a 20 20  nFrom>0 );.  .  
35850 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
35860 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
35870 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
35880 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
35890 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
358a0 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f  om = aFrom;.  fo
358b0 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
358c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
358d0 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
358e0 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
358f0 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
35900 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
35910 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
35920 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
35930 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
35940 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
35950 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
35960 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
35970 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
35980 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 6f     pWInfo->a[iLo
35990 6f 70 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 46 72  op].pWLoop = pFr
359a0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
359b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
359c0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
359d0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
359e0 61 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  at = pWInfo->pOr
359f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
35a00 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  }..  /* Free tem
35a10 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
35a20 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
35a30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
35a40 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
35a50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35a60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
35a70 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
35a80 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
35a90 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
35aa0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
35ab0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
35ac0 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
35ad0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
35ae0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
35af0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
35b00 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
35b10 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
35b20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
35b30 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
35b40 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
35b50 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
35b60 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
35b70 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
35b80 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
35b90 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
35ba0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
35bb0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
35bc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
35bd0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
35be0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
35bf0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
35c00 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
35c10 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
35c20 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
35c30 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
35c40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
35c50 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
35c60 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
35c70 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
35c80 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
35c90 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
35ca0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
35cb0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
35cc0 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
35cd0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
35ce0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
35cf0 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
35d00 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
35d10 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
35d20 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
35d30 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
35d40 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
35d50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
35d60 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
35d70 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
35d80 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
35d90 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
35da0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
35db0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
35dc0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
35dd0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
35de0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
35df0 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
35e00 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
35e10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
35e40 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
35e50 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
35e70 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
35e80 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
35e90 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
35ea0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
35eb0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
35ec0 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
35ed0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
35ee0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
35ef0 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
35f00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
35f10 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
35f20 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
35f30 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
35f40 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
35f50 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
35f60 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
35f70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
35f80 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
35f90 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
35fa0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
35fb0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
35fc0 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
35fd0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
35fe0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
35ff0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
36000 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
36010 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
36020 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
36030 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
36040 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
36050 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
36060 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
36070 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
36080 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
36090 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
360a0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
360b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
360c0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
360d0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
360e0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
360f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
36100 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
36110 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
36120 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
36130 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
36140 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
36150 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
36160 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
36170 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
36180 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
36190 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
361a0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
361b0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
361c0 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
361d0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
361e0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
361f0 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
36200 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
36210 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
36220 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
36230 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
36240 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
36250 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
36260 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
36270 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
36280 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
36290 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
362a0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
362b0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
362c0 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
362d0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
362e0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
362f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
36300 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
36310 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
36320 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
36330 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
36340 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
36350 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
36360 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
36370 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
36380 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
36390 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
363a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
363b0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
363c0 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
363d0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
363e0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
363f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
36400 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
36410 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
36420 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
36430 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
36440 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
36450 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
36460 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
36470 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
36480 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
36490 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
364a0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
364b0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
364c0 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
364d0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
364e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
364f0 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
36500 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
36510 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
36520 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
36530 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
36540 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
36550 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
36560 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
36570 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
36580 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
36590 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
365a0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
365b0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
365c0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
365d0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
365e0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
365f0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
36600 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
36610 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
36620 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
36630 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
36640 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
36650 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
36660 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
36670 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
36680 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
36690 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
366a0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
366b0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
366c0 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
366d0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
366e0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
366f0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
36700 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
36710 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
36720 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
36730 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
36740 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
36750 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
36760 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
36770 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
36780 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
36790 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
367a0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
367b0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
367c0 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
367d0 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
367e0 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
367f0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
36800 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
36810 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
36820 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
36830 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
36840 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65  d.** the returne
36850 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53  d WhereInfo.nOBS
36860 61 74 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  at field is set 
36870 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  to pOrderBy->nEx
36880 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  pr.  This.** is 
36890 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
368a0 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
368b0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
368c0 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
368d0 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64  set.** if an ind
368e0 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
368f0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
36900 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
36910 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
36920 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
36930 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
36940 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
36950 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
36960 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
36970 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66 6f  , then WhereInfo
36980 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f  .nOBSat is 0..*/
36990 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
369a0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
369b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
369c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
369d0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
369e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
369f0 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
36a00 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
36a10 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
36a20 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
36a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36a40 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
36a50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
36a60 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52  erBy,   /* An OR
36a70 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
36a80 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
36a90 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
36aa0 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d    /* The select-
36ab0 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43  list for DISTINC
36ac0 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e  T queries - or N
36ad0 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
36ae0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
36af0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
36b00 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
36b10 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
36b20 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
36b30 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
36b40 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
36b50 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
36b60 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
36b70 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
36b80 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
36b90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
36ba0 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
36bb0 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
36bc0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
36bd0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
36be0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36bf0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
36c00 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
36c10 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
36c20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
36c30 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
36c40 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
36c50 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
36c60 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
36c70 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
36c80 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
36c90 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
36ca0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
36cb0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
36cc0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
36cd0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
36ce0 20 57 68 65 72 65 42 65 73 74 49 64 78 20 73 57   WhereBestIdx sW
36cf0 42 49 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42  BI;         /* B
36d00 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63 68  est index search
36d10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
36d20 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
36d30 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
36d40 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
36d50 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
36d60 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
36d70 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
36d80 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
36d90 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
36da0 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
36db0 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
36dc0 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
36dd0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20  .  int iFrom;   
36de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36df0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
36e00 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
36e10 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
36e20 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
36e30 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
36e40 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70  ination of all p
36e50 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20  WC->a[].wtFlags 
36e60 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
36e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
36e90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
36ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36eb0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
36ec0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
36ed0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
36ee0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36ef0 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20   code */...  /* 
36f00 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c  Variable initial
36f10 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d  ization */.  mem
36f20 73 65 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69  set(&sWBI, 0, si
36f30 7a 65 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73  zeof(sWBI));.  s
36f40 57 42 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61  WBI.pParse = pPa
36f50 72 73 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  rse;.  memset(&s
36f60 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
36f70 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 50  WLB));.  sWLB.pP
36f80 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
36f90 20 73 57 4c 42 2e 64 62 20 3d 20 70 50 61 72 73   sWLB.db = pPars
36fa0 65 2d 3e 64 62 3b 0a 20 20 73 57 4c 42 2e 70 54  e->db;.  sWLB.pT
36fb0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
36fc0 74 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  t;.  sWLB.pOrder
36fd0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
36fe0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
36ff0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
37000 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
37010 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
37020 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
37030 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
37040 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
37050 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
37060 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
37070 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
37080 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
37090 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
370a0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
370b0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
370c0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
370d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
370e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
370f0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
37100 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
37110 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
37120 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
37130 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
37140 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
37150 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
37160 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
37170 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
37180 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
37190 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
371a0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
371b0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
371c0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
371d0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
371e0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
371f0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
37200 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
37210 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
37220 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
37230 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
37240 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
37250 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
37260 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
37270 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
37280 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
37290 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
372a0 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
372b0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
372c0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
372d0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
372e0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
372f0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
37300 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
37310 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
37320 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
37330 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
37340 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
37350 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
37360 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
37370 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
37380 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
37390 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
373a0 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
373b0 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
373c0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
373d0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
373e0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
373f0 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e  ->db;.  nByteWIn
37400 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
37410 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
37420 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
37430 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
37440 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
37450 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
37460 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57  b, .      nByteW
37470 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69  Info + .      si
37480 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65  zeof(WhereClause
37490 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  ) +.      sizeof
374a0 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20  (WhereMaskSet). 
374b0 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
374c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
374d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
374e0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
374f0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
37500 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
37510 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
37520 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
37530 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
37540 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
37550 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
37560 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
37570 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
37580 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
37590 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74  .  pWInfo->pDist
375a0 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
375b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
375c0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
375d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
375e0 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 73 57  pWInfo->pWC = sW
375f0 42 49 2e 70 57 43 20 3d 20 28 57 68 65 72 65 43  BI.pWC = (WhereC
37600 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
37610 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
37620 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
37630 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
37640 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
37650 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
37660 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
37670 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
37680 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
37690 65 74 2a 29 26 73 57 42 49 2e 70 57 43 5b 31 5d  et*)&sWBI.pWC[1]
376a0 3b 0a 20 20 73 57 42 49 2e 61 4c 65 76 65 6c 20  ;.  sWBI.aLevel 
376b0 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 73  = pWInfo->a;.  s
376c0 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
376d0 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
376e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 0a  = pWInfo->pWC;..
376f0 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
37700 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
37710 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
37720 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
37730 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
37740 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
37750 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
37760 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
37770 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
37780 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
37790 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
377a0 6e 63 74 4f 70 74 29 20 29 20 70 44 69 73 74 69  nctOpt) ) pDisti
377b0 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  nct = 0;..  /* S
377c0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
377d0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
377e0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
377f0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
37800 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
37810 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
37820 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
37830 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
37840 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
37850 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
37860 74 28 73 57 42 49 2e 70 57 43 2c 20 70 50 61 72  t(sWBI.pWC, pPar
37870 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77 63  se, pMaskSet, wc
37880 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c  trlFlags);.  sql
37890 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
378a0 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
378b0 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
378c0 6c 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70 57  lit(sWBI.pWC, pW
378d0 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20  here, TK_AND);  
378e0 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32   /* IMP: R-15842
378f0 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20  -53296 */.    . 
37900 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
37910 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
37920 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
37930 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
37940 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
37950 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
37960 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
37970 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
37980 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
37990 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69  Where && (nTabLi
379a0 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
379b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
379c0 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
379d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
379e0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
379f0 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
37a00 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  >iBreak, SQLITE_
37a10 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
37a20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
37a30 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
37a40 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
37a50 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
37a60 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
37a70 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
37a80 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
37a90 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
37aa0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
37ab0 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
37ac0 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
37ad0 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
37ae0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
37af0 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
37b00 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
37b10 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
37b20 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
37b30 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
37b40 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
37b50 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
37b60 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
37b70 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
37b80 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
37b90 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
37ba0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
37bb0 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
37bc0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
37bd0 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
37be0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
37bf0 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
37c00 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
37c10 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
37c20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
37c30 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
37c40 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
37c50 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
37c60 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
37c70 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
37c80 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
37c90 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
37ca0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
37cb0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
37cc0 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
37cd0 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
37ce0 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
37cf0 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
37d00 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
37d10 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
37d20 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
37d30 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
37d40 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
37d50 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
37d60 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
37d70 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
37d80 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
37d90 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
37da0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
37db0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
37dc0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
37dd0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
37de0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
37df0 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
37e00 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
37e10 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
37e20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
37e30 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
37e40 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
37e50 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
37e60 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
37e70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
37e80 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
37e90 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
37ea0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
37eb0 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
37ec0 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
37ed0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
37ee0 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
37ef0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
37f00 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
37f10 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
37f20 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
37f30 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
37f40 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
37f50 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
37f60 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
37f70 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
37f80 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
37f90 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
37fa0 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
37fb0 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
37fc0 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
37fd0 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
37fe0 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
37ff0 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
38000 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
38010 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
38020 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
38030 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
38040 20 73 57 42 49 2e 70 57 43 29 3b 0a 20 20 69 66   sWBI.pWC);.  if
38050 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
38060 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
38070 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
38080 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
38090 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
380a0 71 75 61 6c 69 66 69 65 72 2c 20 69 66 20 74 68  qualifier, if th
380b0 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 73 20 72  ere is one, is r
380c0 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20  edundant. .  ** 
380d0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 73  If it is, then s
380e0 65 74 20 70 44 69 73 74 69 6e 63 74 20 74 6f 20  et pDistinct to 
380f0 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72 65 49 6e  NULL and WhereIn
38100 66 6f 2e 65 44 69 73 74 69 6e 63 74 20 74 6f 0a  fo.eDistinct to.
38110 20 20 2a 2a 20 57 48 45 52 45 5f 44 49 53 54 49    ** WHERE_DISTI
38120 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f 20 74 65  NCT_UNIQUE to te
38130 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ll the caller to
38140 20 69 67 6e 6f 72 65 20 74 68 65 20 44 49 53 54   ignore the DIST
38150 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  INCT..  */.  if(
38160 20 70 44 69 73 74 69 6e 63 74 20 26 26 20 69 73   pDistinct && is
38170 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
38180 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
38190 73 74 2c 20 73 57 42 49 2e 70 57 43 2c 20 70 44  st, sWBI.pWC, pD
381a0 69 73 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20  istinct) ){.    
381b0 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  pDistinct = 0;. 
381c0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
381d0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
381e0 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
381f0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
38200 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
38210 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
38220 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
38230 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
38240 2a 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77  *\n"));.  rc = w
38250 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
38260 73 57 4c 42 29 3b 0a 20 20 69 66 28 20 72 63 20  sWLB);.  if( rc 
38270 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
38280 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 44 69  nError;..  /* Di
38290 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
382a0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
382b0 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65  ts if wheretrace
382c0 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
382d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
382e